2014-09-17 2 views
-2

У меня есть эта функция ниже, которая использует ComponetCount, она находится в Form1, когда я использую эту функцию в другой форме, вставляя Form2 в Form1, она приносит количество Компонентов Form1, а не Form2, как я могу получить вокруг этой проблемы? Следит функция:Delphi: как использовать ComponentCount в публичной функции?

function Form1.getgridId(KeyField: String): string; 
var 
    i: Integer; 
    id: string; 

begin 

    for i := 0 to ComponentCount -1 do 
    begin 
    if Components[i] is TCustomDBGrid then 
    id:= TCustomDBGrid(Components[i]).DataSource.DataSet.FieldByName(KeyField).AsString; 
    end; 
    Result := id; 

end; 

ANS (в моем конкретном случае) - С помощью всего:

function getgridId(KeyField: String): string; 
var 
    i: Integer; 
    id: string; 
begin 
    for i := 0 to Screen.ActiveForm.ComponentCount -1 do 
    begin 
    if Screen.ActiveForm.Components[i] is TCustomDBGrid then 
     id := TCustomDBGrid(Screen.ActiveForm.Components[i]).DataSource.DataSet.FieldByName(KeyField).AsString; 
    end; 
    Result := id; 

end; 
+0

Я понятия не имею, о чем вы спрашиваете. Какой класс вы пытаетесь создать? Как этот код относится к вашему вопросу? О каких единицах вы говорите? –

+3

Компоненты находятся на форме или подобном, а не на устройстве. Итак, передайте эту форму (которая уже была создана?) Функции и повторите ее компоненты. Или передать сетку и не перебирать? –

+0

Вы уверены, что хотите получить значение из ** последнего ** 'TDBGrid'? –

ответ

6

Что вы просите требует добавления параметра в функции знать, какой формы итерировать :

function getgridId(Form: TForm; KeyField: String): string; 
var 
    i: Integer; 
    id: string; 
begin 
    for i := 0 to Form.ComponentCount -1 do 
    begin 
    if Form.Components[i] is TCustomDBGrid then 
     id := TCustomDBGrid(Form.Components[i]).DataSource.DataSet.FieldByName(KeyField).AsString; 
    end; 
    Result := id; 
end; 

Затем, когда каждая форма должна вызвать функцию, она может передать это Self указатель в качестве 1-го параметра.

+0

Спасибо, я думал, что компонент будет автоматически распознавать форму, в которой была вызвана функция. Я думаю, что у Delphi есть функция getformname, но не помню, где. –

+0

Screen.ActiveForm, чтобы получить TForm или .name, чтобы получить строку: D –

+2

@Artur_Indio: 'ComponentCount' /' Components [] '* do * признать, какую форму они вызывают. Вы сделали свою функцию членом класса Form1, и вы использовали параметр 'Self' для доступа к' ComponentCount'/'Components []', поэтому вы всегда вызывали функцию с помощью указателя объекта Form1' , таким образом, итерации через компоненты Form1, даже если функция фактически вызывалась из 'Form2'. Чтобы итерации компонентов Form2, вам нужно было бы получить доступ к 'ComponentCount' /' Components [] ', используя вместо этого указатель объекта Form2', который вы не делали. –

Смежные вопросы