Einzelnen Beitrag anzeigen

Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.837 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

Re: Auf Komponente aus Komponente zugreifen

  Alt 21. Aug 2006, 18:05
Zitat von MarcRB1975:
Nun... ich wollte das eigentlich ganz anders machen.
Hilft Dir das vieleicht weiter?

Mit Form1.Components[i] kann jedes Edit aufgespührt werden

Einfach mal ein paar Edit Felder und eine ListBox auf ein leeres Form und dann AuswahlText drauflegen.
In AuswahlText ist sofort der Text aller Edit Felder zu sehen.
Dann ListBox zuweisen und alles ist in der ListBox.
Wenn dann Edit Felder vom Form gelöscht werden, wird die ListBox automatisch aktualisiert.

Ist als kleine Anregung gedacht

Delphi-Quellcode:
unit AuswahlEdit;

interface

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

type
  TAuswahlEdit = class(TComponent)
  private
    { Private-Deklarationen }
    FmyListBox: TListBox;
    FAuswahlText: string;
    function GetAuswahlText: string;
    procedure SetAuswahlText(const Value: string);
    procedure SetmyListBox(const Value: TListBox);
  protected
    { Protected-Deklarationen }
    procedure Notification(AComponent: TComponent; Operation: TOperation); override;
  public
    { Public-Deklarationen }
    procedure GetAuswahl;
  published
    { Published-Deklarationen }
    property AuswahlText: string read GetAuswahlText write SetAuswahlText stored False;
    property myListBox: TListBox read FmyListBox write SetmyListBox;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Beispiele', [TAuswahlEdit]);
end;

{ TAuswahlEdit }

// Füllt die ListBox ;-)
procedure TAuswahlEdit.GetAuswahl;
var
  i: Integer;
begin
  if (Owner is TForm) and assigned(FmyListBox) then
  begin
    // nur wenn Owner ein Formular ist und auch die ListBox zugewiesen wurde
    FmyListBox.Items.Clear;
    for i := 0 to Owner.ComponentCount - 1 do
    begin
      if Owner.Components[i] is TEdit then // ist es ein TEdit ?
      begin
        // Über TypeCasting kommt man an alle Eigenschaften
        FmyListBox.Items.Add(
          (Owner.Components[i] as TEdit).Name + ' = ' +
          (Owner.Components[i] as TEdit).Text
          );
      end;
    end;
  end;
end;

// Ermittelt den string mit allen Werten
function TAuswahlEdit.GetAuswahlText: string;
var
  i: Integer;
begin
  Result := '';
  if (Owner is TForm) then
  begin
    for i := 0 to Owner.ComponentCount - 1 do
    begin
      if Owner.Components[i] is TEdit then
      begin
        Result := Result + ', "' + (Owner.Components[i] as TEdit).Text + '"';
      end;
    end;
    // Wenn min. ein Edit Feld da sind die Ersten 2 Zeichen ', ' -> weg damit
    if Length(Result) > 2 then Result := copy(Result, 3, length(Result));
  end;
  FAuswahlText := Result; // Ermittelter String wird in FAuswahlText gemerkt ;-)
end;

// Benachitigungen sind immer gut ;-)
procedure TAuswahlEdit.Notification(AComponent: TComponent;
  Operation: TOperation);
begin
  inherited;

  // Wenn ListBox entfernt wird -> Property aud nil setzen
  if (Operation = opRemove) and (AComponent = FmyListBox) then
  begin
    myListBox := nil;
  end;

  // wenn Edit Feld entfernt wird, Listbox Refresh
  if (Operation = opRemove) and AComponent.ClassNameIs('TEdit') then
  begin
    Getauswahl;
  end;

end;

// Das Property kann auch gesetzt werden, dann werden alle Edit Felder
// mit dem eingegebenen Wert überschrieben
procedure TAuswahlEdit.SetAuswahlText(const Value: string);
var
  i: Integer;
begin
  if FAuswahlText <> Value then // Aber nur wenn der Wert dem gemerkten Wert abweicht (s.o.)
  begin
    if (Owner is TForm) then
    begin
      for i := 0 to Owner.ComponentCount - 1 do
      begin
        if Owner.Components[i] is TEdit then
        begin
          (Owner.Components[i] as TEdit).Text := Value;
        end;
      end;
      GetAuswahl;
    end;
  end;
end;

// diese Methode gibts nur, damit auch Getauswahl aufgerufen wird
procedure TAuswahlEdit.SetmyListBox(const Value: TListBox);
begin
  if FmyListBox <> Value then
  begin
    FmyListBox := Value;
    GetAuswahl;
  end;
end;

end.
[edit]Kommentare im Quelltext eingefügt[/edit]
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat