Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Beliebiges Edit ändern (https://www.delphipraxis.net/125149-beliebiges-edit-aendern.html)

Samufi 1. Dez 2008 15:37


Beliebiges Edit ändern
 
Hallo,
ich habe beliebig viele Editfelder und zu jedem einen RadioButton. Ich möchte, dass 'Inhalt' in das Edit geschrieben wird, dessen RadioButton angeklickt ist. Ist es möglich das ohne ein Ausschreiben mit 'if' hinzubekommen, wenn ja, ist das auch für eine unbegrenzte Anzahl Edits machbar? Zur besseren Verständlichkeit ist hier der Quellcode, mit dem die Edits erstellt werden:
Delphi-Quellcode:
unit Ausgabe;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TFrame1 = class(TFrame)
    Button1: TButton;
    Edit1: TEdit;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
var frame1:Tframe1;

implementation

{$R *.dfm}
uses HauptUnit;
procedure TFrame1.Button1Click(Sender: TObject);

VAR I:Integer; newEdit, newEdit2:TEdit; newRadioButton:TRadioButton;
BEGIN
I:=Strtoint(HauptUnit.Form1.EditNR.text);
      newEdit2 := TEdit.Create(Self);
      newEdit2.Name := 'eCode'+IntToStr(I);
      newEdit2.Parent:=Self;
      newEdit2.Visible:=false;
      newRadioButton:=TRadioButton.Create(Self);
      newRadioButton.Name:='Markiere'+InttoStr(I);
      newRadioButton.Parent:=Self;
      newRadioButton.top:= I * 30 + 8;
      newRadioButton.Left:=4;
      newRadioButton.checked:=true;
      newRadioButton.caption:='';
      newRadioButton.Visible:=true;
      newRadioButton.Show;
      newEdit := TEdit.Create(Self);
      newEdit.Name := 'eAusgabe'+IntToStr(I);
      newEdit.Parent := Self;
      newEdit.Top := I * 30 + 8; {Abstand in Abhängikeit von I}
      newEdit.Left := 30;
      newEdit.Width := 500;
      newEdit.Ctl3D:=false;
      newEdit.borderstyle:=bsnone;
      newEdit.ReadOnly:=true;
      newEdit.Text:='';
      newEdit.Show;
HauptUnit.Form1.EditNR.text:=inttostr(I+1);
end;

end.
Es würde mir schon reichen, wenn man schreibt, wie man das Edit der Nr '?' bearbeiten kann, wenn man Nr zur Laufzeit eingeben kann.
Vielen Dank für alles Nachdenken!
Treuergebenst
Samufi

DeddyH 1. Dez 2008 15:39

Re: Beliebiges Edit ändern
 
Such mal nach FindComponent().

Samufi 1. Dez 2008 17:02

Re: Beliebiges Edit ändern
 
Danek, das hat schon geholfen. Wenn ich das jetzt auf einem Frame machen will sagt Delphi mir immer "Operator oder Semikolon fehlt". Was muss ich anders machen? Oder geht das in Frames nicht?
Delphi-Quellcode:
procedure TFrame1.FindComponentClick(Sender: TObject);
var I:Integer;
begin
I:=1;
TEdit(Findcomponent('edit'+inttostr(I))).text:='Text';
end;

DeddyH 1. Dez 2008 17:07

Re: Beliebiges Edit ändern
 
Hast Du einen Button namens FindComponent deklariert? Der Prozedurkopf sieht zumindest danach aus.

Matze 1. Dez 2008 17:16

Re: Beliebiges Edit ändern
 
Hi,

verzeih mir, wenn ich die Syntax im Folgenden falsch mache, aber wäre es nicht viel sinnvoller, wenn du diese Komponenten in einem Array verwalten würdest? Das erspart ein langsames "FindComponent", da nicht erst nach den Komponenten gesucht werden muss.

Delphi-Quellcode:
type TMyComponents = record
  MyEdit1: TEdit;
  MyEdit2: TEdit;
  MyRedioBtn: TRadioButton;
end;

var
  MyComponentsArray = array of TMyComponents;

const
  COMPONENTS_NUM = 20;

// ...

var
  i: Integer;
begin
  SetLength(MyComponentsArray, COMPONENTS_NUM);

  // Erzeugen der Komponenten
  for i := 0 to COMPONENTS_NUM - 1 do
  begin
    MyComponentsArray[i].MyEdit1 := TEdit.Create(Self);
    // ...
    MyComponentsArray[i].MyEdit2 := TEdit.Create(Self);
    // ...
    MyComponentsArray[i].MyRadioBtn := TRadioButton.Create(Self);
    // ...
  end;
end;
So gehören die 3 Komponenten auch "fest" zusammen. Das kannst du dann leicht in einer Schleife durchlaufen:

Delphi-Quellcode:
for i := 0 to COMPONENTS_NUM - 1 do
begin
  if MyComponentsArray[i].MyRadioBtn.Checked then
    MyComponentsArray[i].MyEdit1.Text := 'Inhalt';
end;
Vielleicht geht das auch gar nicht so, aber es könnte sein, dass es tut. :lol: Natürlich könnte man das auch in eine kleine Klasse packen.

Grüße

DeddyH 1. Dez 2008 17:19

Re: Beliebiges Edit ändern
 
Aber Du hast ja auch wieder eine Schleife, wo soll jetzt der Vorteil liegen?

Matze 1. Dez 2008 17:22

Re: Beliebiges Edit ändern
 
Zitat:

Zitat von DeddyH
Aber Du hast ja auch wieder eine Schleife, wo soll jetzt der Vorteil liegen?

Die hast du so oder so.

Vorteile, die ich sehe sind,
- dass RadioButton und Edit nicht unbedingt den gleichen Index im Namen haben müssen
- dass weitere Radiobuttons und Edits, die nicht relevant sind, auch nicht abgefragt werden
- ich finde auch, dass man mit dem Record flexibler ist, wenn man später weitere Komponeneten zuordnen möchte

DeddyH 1. Dez 2008 17:28

Re: Beliebiges Edit ändern
 
Wäre es dann nicht sinnvoller, sich einen Cracker/Class Helper zu schreiben, der die Objektreferenzen enthält?

[edit]Hab das gerade einmal versucht:
Delphi-Quellcode:
unit Test;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TRadioButton = class(StdCtrls.TRadioButton)
  private
    FEdit: TEdit;
  public
    property Edit: TEdit read FEdit write FEdit;
  end;

  TfrmTestMain = class(TForm)
    RadioButton1: TRadioButton;
    Edit1: TEdit;
    RadioButton2: TRadioButton;
    Edit2: TEdit;
    RadioButton3: TRadioButton;
    Edit3: TEdit;
    RadioButton4: TRadioButton;
    Edit4: TEdit;
    RadioButton5: TRadioButton;
    Edit5: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure RadioButton1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  frmTestMain: TfrmTestMain;

implementation

{$R *.dfm}

procedure TfrmTestMain.FormCreate(Sender: TObject);
begin
  RadioButton1.Edit := Edit1;
  RadioButton2.Edit := Edit2;
  RadioButton3.Edit := Edit3;
  RadioButton4.Edit := Edit4;
  RadioButton5.Edit := Edit5;
end;

procedure TfrmTestMain.RadioButton1Click(Sender: TObject);
begin
  if Sender is TRadioButton then
    TRadioButton(Sender).Edit.Text := 'Hallo Welt';
end;

end.
Das würde mit dynamisch erzeugten Komponenten dann genauso gehen.[/edit]

Samufi 1. Dez 2008 20:30

Re: Beliebiges Edit ändern
 
Vielen Dank! Ich hab das jetzt zwar mit einer for-Schleife gemacht, da ich mich mit arrays nicht wirklich auskenne, aber es funktioniert ja trotzdem. So weit bin ich noch nicht, dass mir der Stil, bzw. die Schnelligkeit in dem Maße wichtig ist. Aber dennoch: Danke für den Einwurf! Was würde ich bloß ohne euch tun?! :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz