Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Компоненты Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2011, 12:28   #1
flexterful
Пользователь
 
Регистрация: 22.08.2008
Сообщений: 39
По умолчанию TMemo.Lines.Objects

Доброго времени суток,

Столкнулся с проблемой в Мемо.
Lines : TStrings в конструкторе получает TMemoLines.Create
А TMemoLines неумеют обращаться с объектами - функции неописаны.
Нужны же мне ети объекты в строках для локализации.

Кто сталкивался/решал сию проблему?

У меня Delphi XE

Заранее спасибо
Чего бы тут сделать, дабы ничего неделать?
flexterful вне форума Ответить с цитированием
Старый 03.05.2011, 06:48   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Была раз такая проблемка.
Решение было такое: Строки загонялись в TStringList, объекты, понятно, есть куда деть.
После этого массив строк для отображения присваивался TMemo:
Код:
   Memo1.Lines.Assign(SL);
Ясно, что если требуется редактировать текст в Memo этот примитивный способ не подойдет.
А делать наследника от мемо...
Маленький кошмар в отдельно взятом проекте.
Прик вне форума Ответить с цитированием
Старый 03.05.2011, 16:09   #3
flexterful
Пользователь
 
Регистрация: 22.08.2008
Сообщений: 39
По умолчанию

Сделал я наследника от TCustomMemo, и TMemoLines переписал (наследника следать недаёт, ибо тип описан уже в имплемент секции).
Для объектов создал TObjectList.
Но вот грохаеться оно всё при выключении с 'Invalid pointer operation'...

Код:

type
  TObjectMemoStrings = class(TStrings)
  private
    Memo: TCustomObjectMemo;
    FObjects : TObjectList;
  protected
     {}
    function GetObject(Index: Integer): TObject; override;
    procedure PutObject(Index: Integer; AObject: TObject); override;
    procedure DeleteObject(Index : Integer);
    procedure ClearObjects;
     {}
  public
     {}
    constructor Create;
    destructor Destroy; override;
     {}
    procedure Clear; override;
    procedure Delete(Index: Integer); override;
    procedure Insert(Index: Integer; const S: string); override;
  end;


{ TObjectMemoStrings }

constructor TObjectMemoStrings.Create;
begin
 inherited Create;

 FObjects := TObjectList.Create(True);
end;

destructor TObjectMemoStrings.Destroy;
begin
 ClearObjects;
 FObjects.Free;

 inherited Destroy;
end;

procedure TObjectMemoStrings.Insert(Index: Integer; const S: string);
var
  SelStart, LineLen: Integer;
  Line: string;
begin
  if Index >= 0 then
  begin
    SelStart := SendMessage(Memo.Handle, EM_LINEINDEX, Index, 0);
    if SelStart >= 0
     then Line := S + #13#10
     else begin
      SelStart := SendMessage(Memo.Handle, EM_LINEINDEX, Index - 1, 0);
      if SelStart < 0 then Exit;
      LineLen := SendMessage(Memo.Handle, EM_LINELENGTH, SelStart, 0);
      if LineLen = 0 then Exit;
      Inc(SelStart, LineLen);
      Line := #13#10 + s;
     end;
    SendMessage(Memo.Handle, EM_SETSEL, SelStart, SelStart);
    SendTextMessage(Memo.Handle, EM_REPLACESEL, 0, Line);
{} FObjects.Insert(Index, nil);
  end;
end;

procedure TObjectMemoStrings.Delete(Index: Integer);
var
  SelStart, SelEnd: Integer;
begin
  SelStart := SendMessage(Memo.Handle, EM_LINEINDEX, Index, 0);
  if SelStart >= 0 then
  begin
    SelEnd := SendMessage(Memo.Handle, EM_LINEINDEX, Index + 1, 0);
    if SelEnd < 0
     then SelEnd := SelStart + SendMessage(Memo.Handle, EM_LINELENGTH, SelStart, 0);
    SendMessage(Memo.Handle, EM_SETSEL, SelStart, SelEnd);
    SendTextMessage(Memo.Handle, EM_REPLACESEL, 0, '');
{}    DeleteObject(Index);
  end;
end;


procedure TObjectMemoStrings.Clear;
begin
{}  ClearObjects;
  Memo.Clear;
end;


function TObjectMemoStrings.GetObject(Index: Integer): TObject;
begin
 if (Index >= 0) and (Index < FObjects.Count)
   then Result := FObjects[Index]
   else Result := nil;
end;

procedure TObjectMemoStrings.PutObject(Index: Integer; AObject: TObject);
begin
 if (Index >= 0) and (Index < FObjects.Count)
  then FObjects[Index] := AObject;
end;

procedure TObjectMemoStrings.DeleteObject(Index : Integer);
var
 Elem : TObject;
begin
 if (Index >= 0) and (Index < FObjects.Count)
//  then Exit;
  then FObjects.Delete(Index);

{ Elem := FObjects[Index];
 if Assigned(Elem)
  then Elem.Free;

 FObjects.Delete(Index);
}
end;

procedure TObjectMemoStrings.ClearObjects;
var
 i : integer;
 Elem : TObject;
begin
{ for i := 0 to FObjects.Count - 1 do
  begin
   Elem := FObjects[i];
   if Assigned(Elem)
    then ;//FreeAndNil(Elem);
  end;}
 FObjects.Clear;
end;
Чего бы тут сделать, дабы ничего неделать?
flexterful вне форума Ответить с цитированием
Старый 03.05.2011, 16:40   #4
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Может сделать (предположение, разумеется)
Код:
FObjects := TObjectList.Create(False);
Ведь что получается. В процедуре DeleteObject элементы освобождаются, а потом еще сам ObjectList пытается их освобождать, если Create(True).
Прик вне форума Ответить с цитированием
Старый 03.05.2011, 16:43   #5
flexterful
Пользователь
 
Регистрация: 22.08.2008
Сообщений: 39
По умолчанию

Они освобождаються самим списком при Delete.
Чего бы тут сделать, дабы ничего неделать?
flexterful вне форума Ответить с цитированием
Старый 03.05.2011, 16:50   #6
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Да, вначале не заметил комментарий.
Тогда остается смотреть в отладке где облом происходит.
Прик вне форума Ответить с цитированием
Старый 05.05.2011, 15:01   #7
flexterful
Пользователь
 
Регистрация: 22.08.2008
Сообщений: 39
По умолчанию

Оказываеться сам чудак (на букву М) - сделал в главной форме освобождение объектов из TMemo (100 лет назад) и, конечно, забыл. Проблема решена очищением деструктора формы
Чего бы тут сделать, дабы ничего неделать?
flexterful вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
error C2541: 'delete' : cannot delete objects that are not pointers novokhatsky Общие вопросы C/C++ 2 14.12.2009 10:25
Save position of Drag and Drop objects spein JavaScript, Ajax 3 27.08.2009 20:52
RichEdit.Lines.SaveToFile nusik Общие вопросы Delphi 1 10.05.2009 13:06
Direct Mysql Objects v.1.1 для Delphi7 shepelin БД в Delphi 5 28.03.2008 13:23