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)