Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit Properties (https://www.delphipraxis.net/73374-problem-mit-properties.html)

sundance 17. Jul 2006 12:06


Problem mit Properties
 
Hallo Delphi-Profis,

ich habe folgendes Problem/Herausforderung:
In meiner Delphi-Applikation habe ich ein extra Formular, auf der die ganzen Einstellungen vorgenommen werden. Unter anderem finden sich dort einige TPanels, über die die Programmpfade externer Kommandozeilenapplikationen eingestellt werden können. Um diese Pfade nun auszulesen, wollte ich gerne für jede Applikation eine Property bereitstellen, am liebsten nach folgendem Muster:
Delphi-Quellcode:
property App1Pathname: string read Panel1.Caption;
property App2Pathname: string read Panel2.Caption;
{ etc. }
Das funktioniert so leider nicht. Auch mein Versuch mit einer zusätzlichen Getter-Funktion geht nicht besser:
Delphi-Quellcode:
function GetAppname(aPanel: TPanel): String;
begin
  result := aPanel.Caption
end;

property App1Pathname: string read GetAppname(Panel1);
property App2Pathname: string read GetAppname(Panel2);
Gibt's einen Weg, wie man das hinbekommt, ohne für jedes Property eine eigene Getter-Funktion vorzusehen?

.sundance.

Hawkeye219 17. Jul 2006 12:22

Re: Problem mit Properties
 
Hallo sundance,

ganz ohne Getter wird es wohl nicht gehen, der folgende Code zeigt dir einen möglichen Weg auf:

Delphi-Quellcode:
type
  TForm1 = class (TForm)
    :
  private
    function GetAppname (aPanel: TPanel): String;
  public
    property AppPathname [aPanel: TPanel]: string read GetAppname;
  end;

function TForm1.GetAppname (aPanel: TPanel): String;
begin
  if Assigned(aPanel) then
    Result := aPanel.Caption
  else
    Result := '';
end;
Benutzen kannst du die neue Eigenschaft so:

Delphi-Quellcode:
Name1 := Form1.AppPathname[Panel1];
Eine Sache ist mir noch nicht klar: wie kann der Anwender mit der Caption-Eigenschaft eines Panels eine Einstellung vornehmen?

Gruß Hawkeye

sundance 17. Jul 2006 12:37

Re: Problem mit Properties
 
Hallo Hawkeye,

vielen Dank für deine Antwort.
Allerdings war mein Hintergedanke, dass ich beim Aufruf der Property nicht wissen muss, auf welchem Panel der jeweilige Pfadname steht. Sonst könnte ich mir das alles sparen und einfach nur
Delphi-Quellcode:
Name1 := Form1.Panel1.Caption;
verwenden.
Zitat:

wie kann der Anwender mit der Caption-Eigenschaft eines Panels eine Einstellung vornehmen?
Dafür gibt's einen Eventhandler, den jedes Panel beim Klicken darauf aufruft:
Delphi-Quellcode:
procedure TFormSettings.AppSelectionClick(Sender: TObject);
// Durch Klicken auf das Panelfeld des jeweiligen externen Programms kann über
// einen Dateiauswahldialog der Pfad ausgewählt werden.
var
  aPanel: TPanel;
  fn: String;
begin
  aPanel := Sender as TPanel;    // Zeiger auf geklicktes Panelfeld
  fn := aPanel.Caption;          // Dort eingetragener Dateiname
  with OpenAppDialog do begin
    if FileExists(fn) then
      InitialDir := ExtractFileDir(fn)
    else
      InitialDir := JTools.GetProgramFilesDir;
    if Execute then
      aPanel.Caption := FileName;
  end; { with}
end;
.sundance.

Hawkeye219 17. Jul 2006 12:56

Re: Problem mit Properties
 
Du könntest die index-Direktive nutzen:

Delphi-Quellcode:
type
  TForm1 = class (TForm)
    :
    procedure FormCreate (Sender: TObject);
  private
    Panels : array [1..4] of TPanel;
    function GetAppname (aIndex: Integer): String;
  public
    property App1Pathname: string index 1 read GetAppname;
    property App2Pathname: string index 2 read GetAppname;
    property App3Pathname: string index 3 read GetAppname;
    property App4Pathname: string index 4 read GetAppname;
  end;

procedure TForm1.FormCreate (Sender: TObject);
begin
  Panels[1] := Panel1;
  Panels[2] := Panel2;
  Panels[3] := Panel3;
  Panels[4] := Panel4;
end;

function TForm1.GetAppname (aIndex: Integer): String;
begin
  Result := Panels[aIndex].Caption;
end;
Ungetestet, aber so oder ähnlich sollte es funktionieren. Sicherheitsabfragen mußt du natürlich noch einbauen.

Gruß Hawkeye

sundance 17. Jul 2006 13:01

Re: Problem mit Properties
 
Hawkeye,

das sieht perfekt aus; ich werd's gleich mal ausprobieren.
Vielen Dank schon mal...

.sundance.


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

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