Wykorzystanie właściwości 'name' komponentu z bazy danych

0

Witam.
Przechowuję w bazie właściwość 'Name' komponentu. Pobieram go jako string, i chciałbym z niego korzystać w programie. Podam może przykład:

p := ADOTable.FieldByName('Name').AsString;
p.Visible := False;

W jaki sposób to wykonać? Podejrzewam, że jest to bardzo proste. Ale nie wiem jak. Pomoże ktoś?

0

Mógłbyś spróbować rzutowania, ale musisałbyś wiedzieć z jakiej klasy jest komponent, np. jeżeli jesteś pewny, że komponent o podanej nazwie jest z klasy TEdit i chciałbyś go pokazać metodą Show - musiałbyś zrobić takie cuś:

var
  sCmpName: String;
begin
  { pobranie z bazy nazwy komponentu do zmiennej sCmpName }

  { pokazanie komponentu o przechowywanej nazwie }
  TEdit(FindComponent(sCmpName)).Show();

Jeżeli nie znasz klasy komponentu czy po prostu przechowujesz w bazie nazwy komponentów z róznych klas - zastosuj notację węgierską - będziesz mógł po nazwie komponentu "rozpoznać" jego klasę, lub odczytaj ją sam przez takie cuś:

var
  sCmpName,
  sCmpClassName: String;
begin
  { pobranie z bazy nazwy komponentu do zmiennej sCmpName }

  { wyciągnięcie nazwy klasy obiektu o przechowywanej nazwie }
  sCmpClassName := FindComponent(sCmpName).ClassName;

Później sprawdzasz jaka jest nazwa klasy w zmiennej sCmpClassName i odpowiednio rzutowanie wykonujesz;

EDIT: Niestety nie możesz wykorzystać bezpośrednio łańcucha do rzutowania... np. w ten sposób:

sCmpClassName(FindComponent(sCmpName)).Show();

Takie coś kompilator nie przełknie, a szkoda, choć kompilator musi wiedzieć jak traktować komponent;

0

Działa, ale nie do końca.

Mój kod:

procedure TfrmMain.FormShow(Sender: TObject);
var i : Integer;
    menuItemName : string;
    menuItemVisible : boolean;
begin
  ADODatabase.Connected := True;
  ADOTable.Active := True;
  for i := 0 to ADOTable.RecordCount - 1 do
  begin
    menuItemName := ADOTable.FieldByName('Name').AsString;
    menuItemVisible := ADOTable.FieldByName('Visible').AsBoolean;
    TMenuItem(FindComponent(menuItemName)).Visible := menuItemVisible;
    ADOTable.Next;
  end;
end;

Pierwszy przebieg pętli jest ok. Znajduje komponent i ustawia jego właściwość Visible na pobraną z bazy. Niestety drugi przebieg pętli już się wykłada, bo nie znajduje komponentu. Wywala błąd. Co jest nie tak?

0
Buster napisał(a)

Niestety drugi przebieg pętli już się wykłada, bo nie znajduje komponentu.

Musisz sprawdzić, jaka zostaje odczytana nazwa komponentu z bazy danych i czy komponent o takiej nazwie istnieje; Sprawdź to np. w taki sposób:

for i := 0 to ADOTable.RecordCount - 1 do
  begin
    menuItemName := ADOTable.FieldByName('Name').AsString;
    menuItemVisible := ADOTable.FieldByName('Visible').AsBoolean;

    Application.MessageBox(PChar('menuItemName: ' + menuItemName +
      #10'menuItemVisible: ' + BoolToStr(menuItemVisible, True)), 'Components', MB_OK);

    ADOTable.Next;
  end;

Dzięki temu sprawdzisz jaka jest pobrana z bazy danych nazwa komponentu oraz jego widoczność (tutaj: Visible);

Możesz także programowo sprawdzić czy komponent o podanej nazwie istnieje w taki sposób:

menuItemName := ADOTable.FieldByName('Name').AsString;

Application.MessageBox(PChar('Nazwa: ' + menuItemName + #10'Istnieje: ' +
  BoolToStr(FindComponent(menuItemName) <> nil, True)), 'Components', MB_OK);

1 użytkowników online, w tym zalogowanych: 0, gości: 1