-
Добрый день!
Как выполнить такой трюк: зная имя датасета, получить на него ссылку. Что-то типа ADOConnection.DatasetByName('имя'). ....
без перебора всех датасетов в соединении и сравнении их имен.
Задача может более общая: ссылка на любой компонент через его имя. В VFP помнится была удобная штука, как макроподстановка: &имя. - и работай себе с объектом.
Подскажите, как в делфи такое проделать?
-
> &имя. - и работай себе с объектом. не поверишь, но в дельфи примерно то же самое... только так имя. - и работай себе с объектом. или имяродителя.имя. - и работай себе с объектом. или имямодуля.имяродителя.имя. - и работай себе с объектом. смотря куда ты его впихнул, и откуда пытаешься достучатся.
если непременно хочется искать то попробуй FindComponent... хотя он думается все вперемешку найдет с adocommand и т.д. но если имена датасетов всегда начинать с DS например, а команды с Cmd, то не пересекутся. ну или по списку в DataSets пробежаться.
-
function TForm1.GetDS(Name: String; var DS: TADODataSet): Boolean; var C: TComponent; begin C := FindComponent('ads1'); if C <> nil then if C is TADODataSet then begin DS := TADODataSet(C); Result := True; end; end;
-
кстати, почему в этой функции, без первой строки, даётся подсказка, что результат может быть неопределен? Разве не принято, что булевый результат функции по умолчанию - false?
function TForm1.GetDS(Name: String; var DS: TADODataSet): Boolean; var C: TComponent; begin Result := False; // < ------------------------- первая строка C := FindComponent(Name); if C <> nil then if C is TADODataSet then begin DS := TADODataSet(C); Result := True; end; end;
-
> Разве не принято, что булевый результат функции по умолчанию - false? нет умолчаний, есть не определенная переменная в стеке, память под которой возможно использовалась, и содержащая "мусор". т.е. - результат может быть не определен.
-
> не поверишь, но в дельфи примерно то же самое... > только так > имя. - и работай себе с объектом. > или > имяродителя.имя. - и работай себе с объектом. > или > имямодуля.имяродителя.имя. - и работай себе с объектом.
sniknik, я в курсе как к объектам в делфи обращаться :-) Вопрос был про другое: есть у меня например в строковой переменной S имя объекта (датасета в частности) и я хочу к нему обратиться сразу, без поиска и переборов. В VFP можно сделать &s.Open например.
-
в любом скриптовом языке так можно, но дельфи полноценный компилятор.
логику своей работы меняй...
-
Для "обращения" к любому заранее неизвестному объекту определенного класса можно написать процедуру, где в качестве параметра указать этот самый объект. Что касается именно датасетов, то, как правило, обращаться нужно к тому, что например отображается в активном гриде. В этом случае спасет такая связка
ds: TDataSet;
if (Screen.ActiveControl<>nil) and (Screen.ActiveControl is TDBGrid) then ds := (Screen.ActiveControl as TDBGrid).DataSource.DataSet; if ds.Assigned then ...
-
if (Screen.ActiveControl<>nil) and (Screen.ActiveControl is TDBGrid) then
ds := (Screen.ActiveControl as TDBGrid).DataSource.DataSet;
if ds.Assigned then Небезопасно. Фтопку.
-
> есть у меня например в строковой переменной S имя объекта > (датасета в частности) и я хочу к нему обратиться сразу, > без поиска и переборов
А зачем?
-
Если ты не отдаешь это "на сторону" то проще задать константы-соответствия, и на них ориентироваться. соответственно в коде case dsIndex of
dsTovar:
dsSells:
...
end А вообще вопрос куцый, мало исходных данных.
|