Форум: "Базы";
Текущий архив: 2017.02.12;
Скачать: [xml.tar.bz2];
ВнизОбратиться к датасету через имя Найти похожие ветки
← →
yurikon (2011-07-29 11:26) [0]Добрый день!
Как выполнить такой трюк: зная имя датасета, получить на него ссылку. Что-то типа
ADOConnection.DatasetByName("имя"). ....
без перебора всех датасетов в соединении и сравнении их имен.
Задача может более общая: ссылка на любой компонент через его имя. В VFP помнится была удобная штука, как макроподстановка:
&имя. - и работай себе с объектом.
Подскажите, как в делфи такое проделать?
← →
sniknik © (2011-07-29 12:13) [1]> &имя. - и работай себе с объектом.
не поверишь, но в дельфи примерно то же самое...
только так
имя. - и работай себе с объектом.
или
имяродителя.имя. - и работай себе с объектом.
или
имямодуля.имяродителя.имя. - и работай себе с объектом.
смотря куда ты его впихнул, и откуда пытаешься достучатся.
если непременно хочется искать то попробуй FindComponent... хотя он думается все вперемешку найдет с adocommand и т.д. но если имена датасетов всегда начинать с DS например, а команды с Cmd, то не пересекутся.
ну или по списку в DataSets пробежаться.
← →
SQLEXPRESS (2011-07-29 12:21) [2]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;
← →
SQLEXPRESS (2011-07-29 12:47) [3]кстати, почему в этой функции, без первой строки, даётся подсказка, что результат может быть неопределен?
Разве не принято, что булевый результат функции по умолчанию - 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;
← →
sniknik © (2011-07-29 12:59) [4]> Разве не принято, что булевый результат функции по умолчанию - false?
нет умолчаний,
есть не определенная переменная в стеке, память под которой возможно использовалась, и содержащая "мусор". т.е. - результат может быть не определен.
← →
yurikon (2011-07-29 13:53) [5]
> не поверишь, но в дельфи примерно то же самое...
> только так
> имя. - и работай себе с объектом.
> или
> имяродителя.имя. - и работай себе с объектом.
> или
> имямодуля.имяродителя.имя. - и работай себе с объектом.
sniknik, я в курсе как к объектам в делфи обращаться :-)
Вопрос был про другое: есть у меня например в строковой переменнойS
имя объекта (датасета в частности) и я хочу к нему обратиться сразу, без поиска и переборов. В VFP можно сделать&s.Open
например.
← →
sniknik © (2011-07-29 15:25) [6]в любом скриптовом языке так можно, но дельфи полноценный компилятор.
логику своей работы меняй...
← →
MsGuns © (2011-08-01 09:33) [7]Для "обращения" к любому заранее неизвестному объекту определенного класса можно написать процедуру, где в качестве параметра указать этот самый объект.
Что касается именно датасетов, то, как правило, обращаться нужно к тому, что например отображается в активном гриде. В этом случае спасет такая связка
ds: TDataSet;
if (Screen.ActiveControl<>nil) and (Screen.ActiveControl is TDBGrid) then
ds := (Screen.ActiveControl as TDBGrid).DataSource.DataSet;
if ds.Assigned then
...
← →
Ega23 © (2011-08-01 10:47) [8]
if (Screen.ActiveControl<>nil) and (Screen.ActiveControl is TDBGrid) then
ds := (Screen.ActiveControl as TDBGrid).DataSource.DataSet;
if ds.Assigned then
Небезопасно. Фтопку.
← →
DiamondShark © (2011-08-01 12:11) [9]
> есть у меня например в строковой переменной S имя объекта
> (датасета в частности) и я хочу к нему обратиться сразу,
> без поиска и переборов
А зачем?
← →
Cobalt © (2011-08-03 13:08) [10]Если ты не отдаешь это "на сторону" то проще задать константы-соответствия, и на них ориентироваться.
соответственно в кодеcase dsIndex of
dsTovar:
dsSells:
...
end
А вообще вопрос куцый, мало исходных данных.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2017.02.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.002 c