![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TEdit'ы на TForm [D7, Win95/98, WinME, NT4, Win2k, WinXP]
Easter © (2004-12-10 16:41:00)У меня на TScrollBox находится 8 компонент TMemo, имеющих имя типа memo1, memo2, memo3 и т.д. За пределами TScrollBox лежит resultMemo в котором надо сплюсовать содержимое всех предыдущих. Как это сделать?
Дело в том, что первые мемки создаются динамически и их количество разное, в зависимости от условий...
Leonid Troyanovsky (2004-12-10 18:01:00) [1]
> Rem © (10.12.04 17:54) [17]
> for i := 0 to TabSheet.FindComponent('mResult').ComponentCount
> - 1 do
Если известно, что оные компоненты суть контролы,
то искать их бы следовало среди контролов, бо
вырожденные случаи с Parent = nil, видимо, неинтересны.
(в отличии от Owner = nil, обычного для динамически
создаваемых компонентов).
--
С уважением, LVT.
Rem (2004-12-10 17:54:00) [2]
for i := 0 to TabSheet.FindComponent('mResult').ComponentCount - 1 do
if (TabSheet.FindComponent('mResult').Components[i] is TMemo) then
Lines.Text := Lines.Text + #13'-----'#13 + TMemo(TabSheet.FindComponent('mResult').Components[i]).Lines.Text + #13'-----'#13;
В этом коде вы перебираете все компоненты, владельцем которых является mResult. Если при создании "тех Memo, что в большом количестве" вы пишете TMemo.Create(TabSheet.FindComponent('mResult')), тогда все правильно. Иначе Вам надо перебирать компоненты, владельцем которых является ScrollBox...
Easter (2004-12-10 17:45:00) [3]> Вы же говорите, что TMemo лежат на ScrollBox'е. А на самом деле перебираете компоненты, принадлежащие TMemo с Name = 'mResult'. Не там ищете...
Не совсем. Те мемки, которые плюсуются, лежат на скроле. А мемка в которой плюсуется лежит не на скроле. а на уровень выше - на TabSheet
Rem (2004-12-10 17:39:00) [4]>>
TabSheet.FindComponent('mResult'). ComponentCount
Вы же говорите, что TMemo лежат на ScrollBox'е. А на самом деле перебираете компоненты, принадлежащие TMemo с Name = 'mResult'. Не там ищете...
Rem (2004-12-10 17:36:00) [5]Почему же не можете?
TForm1 = class(TForm)
...
procedure Button1Click(Sender: TObject);
private
ScrollBox: TScrollBox;
procedure CreateScrollBox;
procedure DestroyScrollBox;
...
end;
procedure TForm1.CreateScrollBox;
begin
if (ScrollBox = nil) then
begin
ScrollBox := TScrollBox.Create(Self);
ScrollBox.Parent := Self;
ScrollBox.Left := ...
...
end;
end;
procedure TForm1.DestroyScrollBox;
begin
if (ScrollBox <> nil) then
FreeAndNil(ScrollBox);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if (ScrollBox <> nil) then
...
end;
Easter (2004-12-10 17:35:00) [6]А вот процедура целиком:
procedure TfMain.bNextToStep3Click(Sender: TObject);
var
i: Integer;
TabSheet: TTabSheet;
ScrollBox: TScrollBox;
Memo: TMemo;
begin
TabSheet := TTabSheet.Create(Self);
TabSheet.PageControl := pcMain;
TabSheet.Caption := ' Øàã 3 ';
TabSheet.Name := 'ts3';
with TMemo.Create(TabSheet) do
begin
Align := alClient;
Parent := TabSheet;
Name := 'mResult';
Lines.Clear;
for i := 0 to TabSheet.FindComponent('mResult').ComponentCount - 1 do
if (TabSheet.FindComponent('mResult').Components[i] is TMemo) then
Lines.Text := Lines.Text + #13'-----'#13 + TMemo(TabSheet.FindComponent('mResult').Components[i]).Lines.Text + #13'-----'#13;
end;
end;
Easter (2004-12-10 17:34:00) [7]Сделал так:
TabSheet.FindComponent('mResult')
Уже не ругается, но и не складывает %)))
Easter (2004-12-10 17:30:00) [8]Ага, понятно. Тогда такой вопрос... ScrollBox тоже динамически создается в другой процедуре, которая идет перед моей. По сему я не могу на него сослатся по имени. Как тогда это сделать?
Rem (2004-12-10 17:27:00) [9]begin...end © (10.12.04 17:20) [8]
>>Да, но про порядок создания в вопросе ничего не было.
Согласен. Ваше решение полностью соответствует поставленной задаче. Пойду курить... :)
Rem (2004-12-10 17:23:00) [10]Правильно ругается. У Вас проверка "is" идет перед циклом, и выполняется один единственный раз для i-го компонента (чему равно при этом i?).
for i := 0 to ScrollBox.ComponentCount - 1 do
if (ScrolBox.Components[i] is TMemo) then
ResultMemo.Lines.Text := ResultMemo.Lines.Text + #13'-----'#13 + TMemo(ScrollBox.Components[i]).Lines.Text + #13'-----'#13;
Но, как правильно сказал begin...end, это будет верно только при условии, когда порядок создания Memo совпадает с физическим размещением. Т. е., первый создаваемый Memo должен размещаться вверху, ниже него - второй, и т. д.
begin...end (2004-12-10 17:20:00) [11]> [5] Easter (10.12.04 17:13)
Строка if (ScrollBox.Components[i] is TMemo) thenдолжна быть внутри цикла. Не говоря уже о надобности with ResultMemo do.
> [6] Rem © (10.12.04 17:18)
Да, но про порядок создания в вопросе ничего не было.
Easter (2004-12-10 17:20:00) [12]Уважаемый Rem, тогда подскажи как твоим спосбом перед текстом каждой из мемок добавлять разделители (как в примере моего кода)? Я только учусь...
Rem (2004-12-10 17:18:00) [13]Это будет верно для случая, когда Memo создаются в порядке последующего физического расположения.
Easter (2004-12-10 17:13:00) [14]Сделал так...
if (ScrollBox.Components[i] is TMemo) then
begin
for i := 0 to ScrollBox.ComponentCount - 1 do
begin
Lines.Add('---');
Lines.Add( TMemo(ScrollBox.Components[i]).Lines.Text );
Lines.Add('---');
Lines.Add('');
end;
end;
Ругается...
begin...end (2004-12-10 17:02:00) [15]> [3] Rem © (10.12.04 16:55)
По-моему, это будет верно только для случая, когда порядок "склеивания" текста не имеет значения.
Rem (2004-12-10 16:55:00) [16]
for i := 0 to ScrollBox.ComponentCount - 1 do
if (ScrolBox.Components[i] is TMemo) then
ResultMemo.Lines.Text := ResultMemo.Lines.Text + {#10#13 +} TMemo(ScrollBox.Components[i]).Lines.Text;
begin...end (2004-12-10 16:51:00) [17]Ой, извиняюсь: перед untilнужно добавить Inc(I).
begin...end (2004-12-10 16:50:00) [18]> Easter (10.12.04 16:41)
var
I: Integer;
M: TComponent;
begin
I := 1;
repeat
M := ScrollBox.FindComponent('Memo' + IntToStr(I));
if Assigned(M) and (M is TMemo) then
// Добавляем текст из TMemo(M) в ResultMemo
until not Assigned(M)
end.