Re: using value of a string as reference to Delphi component
Posted by webmaster Guido on June 20, 2003
: i'm not sure if this can be done, but i'd like to read in a string, and then reference a component from it.
: please let me know if this is doable (and an example of it working).
: here is a simple example :
: // you can do
: // you CANT do
In Delphi, you can not *directly* reference a component from a string, but there is a way around, although with some limitations.
Given the component's name, you can search through all the components of a form, and if a component with that name is found, put a reference to that component in a temporary variable, say TempComp. If TempComp is of the desired TYPE, you can change properties of TempComp. So, you have to decide if you're going to modify a TLabel with a certain name, or a TEdit, or another type of component.
An example: a Delphi form contains several TLabel components, named Label1, Label2, and so on... We want a procedure to change the caption of a certain label by specifying the label's name, like this:
ChangeLabelCap('Label2', 'Caption of Label2');
This procedure will do the job, and additionally give a warning if the label is not found:
procedure TForm1.ChangeLabelCap(CompName, CompCaption: string); var Found: Boolean; i: integer; TempComp: TComponent; begin Found := False; for i := 0 to ComponentCount - 1 do begin if LowerCase(Components[i].Name) = LowerCase(CompName) then begin TempComp := Components[i]; Found := TempComp is TLabel; end; if Found then break; end; if Found then // TYPECAST TempComp as a TLabel before using it (TempComp as TLabel).Caption := CompCaption else ShowMessage('No label found with the name ' + CompName); end;With this code as a basis, you can easily write other procedures, like for example: change the color of a named TPanel. You could also expand the procedure above for *several* types of components, and change a string-property if a suitable component with the given name is found. Some ideas: change the caption of a label, OR the caption of a button, OR the text of an edit, and more... Here's an example:
procedure TForm1.ChangeCompString(CompName, S: string); var Found: Boolean; i: integer; TempComp: TComponent; begin Found := False; for i := 0 to ComponentCount - 1 do begin if LowerCase(Components[i].Name) = LowerCase(CompName) then begin TempComp := Components[i]; Found := (TempComp is TLabel) or (TempComp is TButton) or (TempComp is TEdit); end; if Found then break; end; if not Found then ShowMessage('Not found of correct type: ' + CompName) else if TempComp is TLabel then (TempComp as TLabel).Caption := S else if TempComp is TButton then (TempComp as TButton).Caption := S else if TempComp is TEdit then (TempComp as TEdit).Text := S; end;
[ DelphiLand: free Delphi source code, tips, tutorials ]