На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> TStringSparseList из Grids , В классе нужно свойство cells как в TStringGrid
    Не пойму, почему этот класс не виден из других модулей.
    В том смысле, почему его видимым не сделали...

    Мне в классе нужно свойство cells как в TStringGrid.
    Вопрос: нормально ли с точки зрения стиля перекопировать класс TStringSparseList в свой модуль?

    UPD Хочу немного перефрмулировать вопрос: правильно ли я создаю свойство Cells, перекопируя код из модуля Grids?
    Может, есть другой способ задать такое свойство в своем классе?
    Сообщение отредактировано: ttiger -
      Нормально. Но если меняешь что-то в нем, то поменяй и имя.
        Мне так претит идея тиражирования кода, что я на целый час сел думать над тем, что хуже: тиражировать код, или править системные борландовские модули.

        :-?

        Добавлено
        И правильно ли я решаю поставленную задачу?
        Правильно ли завожу свойство Cells?
          Цитата ttiger @
          править системные борландовские модули.

          А вот это плохо. НАкатишь апдейт или сменишь версию - и сиди думай, надо править или нет.
            UPD Хочу немного перефрмулировать вопрос: правильно ли я создаю свойство Cells, перекопируя код из модуля Grids?
            Может, есть другой способ задать такое свойство в своем классе?
              >Может, есть другой способ задать такое свойство в своем классе?

              Что требуется от свойства?
                Мне требуется провести манипуляции с двумерным массивом стрингов, а затем вывести в стринггрид.
                  >Мне требуется провести манипуляции с двумерным массивом стрингов

                  Просто двумерный массив или список (массивов, списков) строк не устраивает?
                  Если нет, то чем именно?
                  Сообщение отредактировано: MBo -
                    Можешь пример привести, а то я что-то придумать не могу.
                    Изначально хотелось, чтоб это свойство можно было запросто присвоить стринггриду,
                    ExpandedWrap disabled
                        StringGrid.Cells:=MyObject.MyProperty;

                    Судя по всему, такое сделать нельзя, потому не откажусь от готового двумерного массива строк, с добавлением и уничтожением элементов.
                    Сообщение отредактировано: ttiger -
                      Цитата ttiger @
                      Судя поо всему, такое сделать нельзя, потому не откажусь от готового двумерного массива строк, с бобавлением и уничтожением элементов

                      TObjectList с элементами = TStringList

                      Добавлено
                      Затем копирование в грид делается простым циклом, например, если в стринг-листах хранятся элементы столбцов, то StringGrid1.Cols[i]:=TStringList(ObjectList)[i];
                        Можно пример?

                        Добавлено
                        Цитата leo @
                        Затем копирование в грид делается простым циклом

                        Видимо, так и придется сделать.
                          Сегодня уже позндовато, утро вечера мудренее ;)

                          Добавлено
                          А с TStringSparseList точно не стоит связываться - там такие страшные замуты, да и sparse совершенно ни к чему. Я как-то сязку TObjectList of TStringList для TDrawGrid делал на несколько десятков тысяч строк - все замечательно и быстро работало и никаких особых проблем с памятью не наблюдалось
                          все, пора сматывать ;)
                            Цитата ttiger @
                            Можно пример?

                            Если "просто, но со вкусом" ;), то примерно так:
                            ExpandedWrap disabled
                              uses
                                Classes,Contnrs,Grids;
                               
                              type
                                TMyTable = class(TPersistent)
                                protected
                                  FCols:TObjectList;
                                  FColCount:integer;
                                  FRowCount:integer;
                                  function EnsureCol(Col:integer;EnsureRows:boolean):TStringList;
                                  procedure SetColCount(Value:integer);
                                  procedure SetRowCount(Value:integer);
                                  function GetCol(Index:integer):TStringList;
                                  function GetCell(Col,Row:integer):string;
                                  procedure SetCell(Col,Row:integer;const S:string);
                                  procedure AssignTo(Dest: TPersistent);override;
                                public
                                  constructor Create;
                                  destructor Destroy;override;
                                  procedure Assign(Source:TPersistent);override;
                                  procedure Clear;
                                  property ColCount:integer read FColCount write SetColCount;
                                  property RowCount:integer read FRowCount write SetRowCount;
                                  property Cols[Col:integer]:TStringList read GetCol;
                                  property Cells[Col,Row:integer]:string read GetCell write SetCell;
                                end;
                               
                              constructor TMyTable.Create;
                              begin
                                inherited Create;
                                FCols:=TObjectList.Create;
                              end;
                              destructor TMyTable.Destroy;
                              begin
                                FCols.Free;
                                inherited Destroy;
                              end;
                              procedure TMyTable.Clear;
                              begin
                                FCols.Clear;
                                FColCount:=0;
                                FRowCount:=0;
                              end;
                              function TMyTable.EnsureCol(Col:integer;EnsureRows:boolean):TStringList;
                              var
                                i:integer;
                              begin
                                Result:=TStringList(FCols[Col]);
                                if Result = nil then
                                begin
                                  Result:=TStringList.Create;
                                  FCols[i]:=Result;
                                end;
                                if EnsureRows and (Result.Count <> FRowCount) then
                                begin
                                  //к сожалению, в TStringList нельзя прямо изменять Count,
                                  //поэтому приходится "криво"
                                  if Result.Count < FRowCount then
                                    for i:=Result.Count to FRowCount-1 do
                                      Result.Append('')
                                  else
                                    for i:=Result.Count-1 downto FRowCount do
                                      Result.Delete(i);
                                end;
                              end;
                               
                              procedure TMyTable.Assign(Source:TPersistent);
                              var
                                sg:TStringGrid;
                                i:integer;
                              begin
                                if (Source <> Nil) and (Source is TStringGrid) then
                                begin
                                  sg:=TStringGrid(Source);
                                  Clear;
                                  ColCount:=sg.ColCount;
                                  FRowCount:=sg.RowCount;
                                  for i:=0 to ColCount-1 do
                                    EnsureCol(i,false).AddStrings(sg.Cols[i]);
                                end
                                else
                                  inherited Assign(Source);
                              end;
                              procedure TMyTable.AssignTo(Dest: TPersistent);
                              var
                                sg:TStringGrid;
                                i:integer;
                              begin
                                if (Dest <> Nil) and (Dest is TStringGrid) then
                                begin
                                  sg:=TStringGrid(Dest);
                                  sg.ColCount:=ColCount;
                                  sg.RowCount:=RowCount;
                                  for i:=0 to ColCount-1 do
                                    sg.Cols[i]:=EnsureCol(i,true);
                                end
                                else
                                  inherited AssignTo(Dest);
                              end;
                              procedure TMyTable.SetColCount(Value:integer);
                              var
                                i:integer;
                              begin
                                if Value <= 0 then
                                  Clear
                                else
                                if Value <> FColCount then
                                begin
                                  FCols.Count:=Value;
                                  for i:=FColCount to Value-1 do
                                    EnsureCol(i,RowCount > 0);
                                  FColCount:=Value;
                                end;
                              end;
                              procedure TMyTable.SetRowCount(Value:integer);
                              var
                                i:integer;
                              begin
                                if Value <> FRowCount then
                                begin
                                  FRowCount:=Value;
                                  for i:=0 to ColCount-1 do
                                    EnsureCol(i,true);
                                end;
                              end;
                              function TMyTable.GetCol(Index:integer):TStringList;
                              begin
                                Result:=EnsureCol(Index,true);
                              end;
                              function TMyTable.GetCell(Col,Row:integer):string;
                              begin
                                Result:=EnsureCol(Col,true)[Row];
                              end;
                              procedure TMyTable.SetCell(Col,Row:integer;const S:string);
                              begin
                                EnsureCol(Col,true)[Row]:=S;
                              end;


                            Использование:
                            ExpandedWrap disabled
                                mt:=TMyTable.Create;
                                mt.Assign(StringGrid1);
                                ...
                                StringGrid1.Assign(mt);

                            Хотя, если хранить строки в такой таблице, то по идее лучше вместо TStringGrid использовать TDrawGrid
                            Сообщение отредактировано: leo -
                              Ого! А почему он наследник от TPersistent?
                                >А почему он наследник от TPersistent?
                                из хелпа:
                                TPersistent encapsulates the behavior common to all objects that can be assigned to other objects
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0664 ]   [ 15 queries used ]   [ Generated: 19.05.24, 03:00 GMT ]