Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.224.73.97] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Не пойму, почему этот класс не виден из других модулей.
В том смысле, почему его видимым не сделали... Мне в классе нужно свойство cells как в TStringGrid. Вопрос: нормально ли с точки зрения стиля перекопировать класс TStringSparseList в свой модуль? UPD Хочу немного перефрмулировать вопрос: правильно ли я создаю свойство Cells, перекопируя код из модуля Grids? Может, есть другой способ задать такое свойство в своем классе? |
Сообщ.
#2
,
|
|
|
Нормально. Но если меняешь что-то в нем, то поменяй и имя.
|
Сообщ.
#3
,
|
|
|
Мне так претит идея тиражирования кода, что я на целый час сел думать над тем, что хуже: тиражировать код, или править системные борландовские модули.
Добавлено И правильно ли я решаю поставленную задачу? Правильно ли завожу свойство Cells? |
Сообщ.
#4
,
|
|
|
Цитата ttiger @ править системные борландовские модули. А вот это плохо. НАкатишь апдейт или сменишь версию - и сиди думай, надо править или нет. |
Сообщ.
#5
,
|
|
|
UPD Хочу немного перефрмулировать вопрос: правильно ли я создаю свойство Cells, перекопируя код из модуля Grids?
Может, есть другой способ задать такое свойство в своем классе? |
Сообщ.
#6
,
|
|
|
>Может, есть другой способ задать такое свойство в своем классе?
Что требуется от свойства? |
Сообщ.
#7
,
|
|
|
Мне требуется провести манипуляции с двумерным массивом стрингов, а затем вывести в стринггрид.
|
Сообщ.
#8
,
|
|
|
>Мне требуется провести манипуляции с двумерным массивом стрингов
Просто двумерный массив или список (массивов, списков) строк не устраивает? Если нет, то чем именно? |
Сообщ.
#9
,
|
|
|
Можешь пример привести, а то я что-то придумать не могу.
Изначально хотелось, чтоб это свойство можно было запросто присвоить стринггриду, StringGrid.Cells:=MyObject.MyProperty; Судя по всему, такое сделать нельзя, потому не откажусь от готового двумерного массива строк, с добавлением и уничтожением элементов. |
Сообщ.
#10
,
|
|
|
Цитата ttiger @ Судя поо всему, такое сделать нельзя, потому не откажусь от готового двумерного массива строк, с бобавлением и уничтожением элементов TObjectList с элементами = TStringList Добавлено Затем копирование в грид делается простым циклом, например, если в стринг-листах хранятся элементы столбцов, то StringGrid1.Cols[i]:=TStringList(ObjectList)[i]; |
Сообщ.
#11
,
|
|
|
Можно пример?
Добавлено Цитата leo @ Затем копирование в грид делается простым циклом Видимо, так и придется сделать. |
Сообщ.
#12
,
|
|
|
Сегодня уже позндовато, утро вечера мудренее
Добавлено А с TStringSparseList точно не стоит связываться - там такие страшные замуты, да и sparse совершенно ни к чему. Я как-то сязку TObjectList of TStringList для TDrawGrid делал на несколько десятков тысяч строк - все замечательно и быстро работало и никаких особых проблем с памятью не наблюдалось все, пора сматывать |
Сообщ.
#13
,
|
|
|
Цитата ttiger @ Можно пример? Если "просто, но со вкусом" , то примерно так: 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; Использование: mt:=TMyTable.Create; mt.Assign(StringGrid1); ... StringGrid1.Assign(mt); Хотя, если хранить строки в такой таблице, то по идее лучше вместо TStringGrid использовать TDrawGrid |
Сообщ.
#14
,
|
|
|
Ого! А почему он наследник от TPersistent?
|
Сообщ.
#15
,
|
|
|
>А почему он наследник от TPersistent?
из хелпа: TPersistent encapsulates the behavior common to all objects that can be assigned to other objects |