Конференция "Базы" » Обратиться к датасету через имя [D7, MSSQL]
 
  • yurikon (29.07.11 11:26) [0]
    Добрый день!

    Как выполнить такой трюк: зная имя датасета, получить на него ссылку. Что-то типа
    ADOConnection.DatasetByName('имя').  ....

    без перебора всех датасетов в соединении и сравнении их имен.

    Задача может более общая: ссылка на любой компонент через его имя. В VFP помнится была удобная штука, как макроподстановка:
    &имя. - и работай себе с объектом.

    Подскажите, как в делфи такое проделать?
  • sniknik © (29.07.11 12:13) [1]
    > &имя. - и работай себе с объектом.
    не поверишь, но в дельфи примерно то же самое...
    только так
    имя. - и работай себе с объектом.
    или
    имяродителя.имя. - и работай себе с объектом.
    или
    имямодуля.имяродителя.имя. - и работай себе с объектом.
    смотря куда ты его впихнул, и откуда пытаешься достучатся.

    если непременно хочется искать то попробуй FindComponent... хотя он думается все вперемешку найдет с adocommand и т.д. но если имена датасетов всегда начинать с DS например, а команды с Cmd, то не пересекутся.
    ну или по списку в DataSets пробежаться.
  • SQLEXPRESS (29.07.11 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 (29.07.11 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 © (29.07.11 12:59) [4]
    > Разве не принято, что булевый результат функции по умолчанию - false?
    нет умолчаний,
    есть не определенная переменная в стеке, память под которой возможно использовалась, и содержащая "мусор". т.е. - результат может быть не определен.
  • yurikon (29.07.11 13:53) [5]

    > не поверишь, но в дельфи примерно то же самое...
    > только так
    > имя. - и работай себе с объектом.
    > или
    > имяродителя.имя. - и работай себе с объектом.
    > или
    > имямодуля.имяродителя.имя. - и работай себе с объектом.


    sniknik, я в курсе как к объектам в делфи обращаться :-)

    Вопрос был про другое: есть у меня например в строковой переменной
    S

    имя объекта (датасета в частности) и я хочу к нему обратиться сразу, без поиска и переборов. В VFP можно сделать
    &s.Open

    например.
  • sniknik © (29.07.11 15:25) [6]
    в любом скриптовом языке так можно, но дельфи полноценный компилятор.

    логику своей работы меняй...
  • MsGuns © (01.08.11 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 © (01.08.11 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 © (01.08.11 12:11) [9]

    > есть у меня например в строковой переменной S имя объекта
    > (датасета в частности) и я хочу к нему обратиться сразу,
    >  без поиска и переборов

    А зачем?
  • Cobalt © (03.08.11 13:08) [10]
    Если ты не отдаешь это "на сторону" то проще задать константы-соответствия, и на них ориентироваться.
    соответственно в коде
    case dsIndex of
     dsTovar:
     dsSells:
     ...
    end



    А вообще вопрос куцый, мало исходных данных.
 
Конференция "Базы" » Обратиться к датасету через имя [D7, MSSQL]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]