Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.679 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