AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[RTTI] Properties beim Namen nennen - in D7

Ein Thema von Medium · begonnen am 2. Sep 2011 · letzter Beitrag vom 2. Sep 2011
 
Medium

Registriert seit: 23. Jan 2008
3.689 Beiträge
 
Delphi 2007 Enterprise
 
#4

AW: [RTTI] Properties beim Namen nennen - in D7

  Alt 2. Sep 2011, 11:35
Ich schließ hier mal an, da im Prinzip selbes Thema. Ich habe nun folgendes gebastelt:
Delphi-Quellcode:
procedure TBUThread.Update(tableName, nameColumn: String; valueColumns: array of String; controlClasses: array of TObject; controlPrefixes, controlValueProperties: array of String; rowList: TList);
var
  o: TComponent;
  i: Integer;
begin
  FQry.SQL.Text := 'SELECT '+nameColumn+', ';
  for i := 0 to High(valueColumns) do
    if i < High(valueColumns) then
      FQry.SQL.Add(valueColumns[i]+', ')
    else
      FQry.SQL.Add(valueColumns[i]);
  if rowList.Count > 0 then
  begin
    FQry.SQL.Add(' FROM '+tableName+' WHERE id IN (');
    for i := 0 to rowList.Count-1 do
    begin
      if i<(rowList.Count-1) then
        FQry.SQL.Add(IntToStr(Integer(rowList[i]))+', ')
      else
        FQry.SQL.Add(IntToStr(Integer(rowList[i]))+')');
    end;
  end
  else
    FQry.SQL.Add(' FROM '+tableName);
  FQry.Open;
  while Assigned(FQry) and Assigned(FForm) and (not FQry.Eof) do
  begin
    for i := 0 to High(valueColumns) do
    begin
      o := FForm.FindComponent(controlPrefixes[i]+FQry.FieldByName(nameColumn).AsString);
      if Assigned(o) and (o is controlClasses[i].ClassType) and (o as TControl).Parent.Visible then
      begin
        try
          SetPropValue((o as controlClasses[i].ClassType), controlValueProperties[i], FQry.FieldByName(valueColumns[i]).AsVariant);
        except
        end;
      end;
    end;
    FQry.Next;
  end;
  FQry.Close;
  for i := 0 to High(controlClasses) do
    controlClasses[i].Free;
end;
Wichtig ist hiervon zwar nur die Zeile mit dem SetPropValue() , aber zum Verständnis besser mal ganz. Aufgerufen wird dann z.B. so: Update('wertetabelle', 'komponame', ['wert'], [TSomeControl.Create(nil)], ['lb'], ['Value'], Rows); Dies nimmt sich dann alle Komponenten auf dem Formular, die 'lb'+komponame heissen, und will diesen iherer Property "Value" den Wert aus der Spalte "wert" aus der Tabelle zuweisen.
Mit einer meiner eigenen Komponenten klappt das prima, bei TMS' TAdvEdit gibt's eine Exception, wenn ich TAdvEdit.FloatValue etwas zuweisen möchte. Ein Unterschied, den ich festgestellt habe ist, dass ich bei meiner eigenen Kompo auf eine published Property zugreife, "FloatValue" ist im TAdvEdit jedoch nur public. Ich habe im Hinterkopf, dass bzgl. Sichtbarkeit und RTTI da was war. Gibt es prinzipiell keine Chance auf nur public Properties so zuzugreifen?
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz