Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Form als Parameter übergeben (https://www.delphipraxis.net/164739-form-als-parameter-uebergeben.html)

Aleshi 28. Nov 2011 08:58

Delphi-Version: 5

Form als Parameter übergeben
 
Hallo,

dies ist mein erster Beitrag und ich programmier auch noch nicht so lange Delphi. Hoffe ihr könnt mir helfen.

Nun zu meinem Problem.

Ich hab eine MdiParent Form und in dieser möchte ich eine Procedure schreiben in welcher Farben für Label, EditFelder, Panels usw fesgelegt werden. Ich habe auch ein componentcount drinn um rauszufinden was für Komponenten vorhanden sind. Diese Procedure soll aber con jedem MdiChild das ich erstelle aufgerufen werden und die jeweilige MdiChild Form soll als Parameter übergeben werden damit ich dann mit dem componentcount die Komponenten rausfinden kann. Wie übergebe ich aber die MdiChild Form als Parameter an die Procedure?

Dies ist die Procedure in der Main

Code:
Procedure TfrMain.DatenImport(????);
var ini: TIniFile;
    a, c, e, g, j: String;
    b, d, f, h, i, k, l: Integer;
begin
  ini := TIniFile.create('c:\Delphi\Farben2.ini');
  try
    a := ini.ReadString('TPanel','Farbe','0');
    b := StrToInt(a);
    c := ini.ReadString('TPanel','Schriftfarbe','0');
    d := StrToInt(c);
    e := ini.ReadString('TForm','Farbe','0');
    f := StrToInt(e);
    g := ini.ReadString('TLabel','Schriftfarbe','0');
    h := StrToInt(g);
    j := ini.ReadString('TEdit','Schriftfarbe','0');
    k := StrToInt(j);
    with z do
    begin
       for i := 0 to ComponentCount -1 do
         if (Components[i] is TPanel) then
           begin
             (Components[i] as TPanel).ParentBackground := false;
             (Components[i] as TPanel).color:= b;
             (Components[i] as TPanel).Font.Color := d;
           end
         else if (Components[i] is TLabel) then
           begin
             (Components[i] as TLabel).Font.Color := h;
           end
         else if (Components[i] is TEdit) then
           begin
             (Components[i] as TEdit).Color := k;
           end;
    end;
  finally
  ini.free;
end;
end;
und dies soll der Aufruf von der Child Form sein:

Code:
procedure TfrChild.FormCreate(Sender: TObject);
Var
begin
  TfrMain.DatenImport(???);
end;

end.
Momentan ist es natürlich so das er in der Main Form TLabel, TPanel usw als undefiniert makiert weil ja diese Komponenten nicht auf der Main vorhanden sind, sollen ja auch die von den Childs sein...

Vielen Dank im Vorraus

Bummi 28. Nov 2011 09:04

AW: Form als Parameter übergeben
 
Delphi-Quellcode:
//Procedure TfrMain.DatenImport(Dest:TForm);
//oder
Procedure TfrMain.DatenImport(Dest:TComponent); // dann kannst Du es auch Recursiv verwenden
var
....
begin
...
for i := 0 to Dest.ComponentCount -1 do
 if (Dest.Components[i] is TPanel) then
Ich würde es aber gleich als einfache Prozedur nicht als Klassenprozedur implementieren

Aleshi 28. Nov 2011 09:26

AW: Form als Parameter übergeben
 
Hallo Bummi,

zuerstmal Danke für die schnelle Antwort.

Aber irgendwas mach ich falsch, wenn ich die Procedure dann vom Child mit

Code:
TfrMain.DatenImport(Dest:TComponents));
aufrufen möchte meckert er wegen dem Dest und die Komponenten sind auf der Main immernoch unbekannt.

Sorry für meine Unwissenheit :-) aber ich lern Delphi irgendwie komplett chaotisch ;-)

ConnorMcLeod 28. Nov 2011 10:00

AW: Form als Parameter übergeben
 
Zitat:

Zitat von Aleshi (Beitrag 1138185)
Code:
procedure TfrChild.FormCreate(Sender: TObject);
Var
begin
  TfrMain.DatenImport(???);
end;

... wird zu ...
Delphi-Quellcode:
procedure TfrChild.FormCreate(Sender: TObject);
begin
  frMain.DatenImport(Self);
end;

Sir Rufo 28. Nov 2011 10:03

AW: Form als Parameter übergeben
 
Eigentlich hat diese Funktionalität doch nichts mit der MainForm zu schaffen?
Warum also eine Methode in der MainForm, und nicht eine einfache procedure (in einer eigenen Unit)?

Oder besser noch eine eigene Klasse, welche die Ini-Datei einmal liest und dann mit diesen Werte arbeitet?

Also hier mal als procedure:
Delphi-Quellcode:
unit FormControlCustomize;

interface

uses
  Classes; // TComponent

procedure CompFarbenSetzen( aOwner : TComponent );

implementation

uses
  StdCtrls, // TEdit, TLabel
  ExtCtrls, // TPanel
  IniFiles; // TIniFile

procedure CompFarbenSetzen( aOwner : TComponent );
var ini: TIniFile;
    a : String;
    b, d, f, h, i, k, l: Integer;
begin
  ini := TIniFile.create('c:\Delphi\Farben2.ini');
  try
    // Warum so kompliziert???
    a := ini.ReadString('TPanel','Farbe','0');
    b := StrToInt(a);

    // das geht auch einfacher mit
    b := ini.ReadInteger( 'TPanel', 'Farbe', 0 );

    a := ini.ReadString('TPanel','Schriftfarbe','0');
    d := StrToInt( a );
    a := ini.ReadString('TForm','Farbe','0');
    f := StrToInt( a );
    a := ini.ReadString('TLabel','Schriftfarbe','0');
    h := StrToInt( a );
    a := ini.ReadString('TEdit','Schriftfarbe','0');
    k := StrToInt( a );

    with aOwner do
    begin
       for i := 0 to ComponentCount -1 do
         if (Components[i] is TPanel) then
           begin
             (Components[i] as TPanel).ParentBackground := false;
             (Components[i] as TPanel).color:= b;
             (Components[i] as TPanel).Font.Color := d;
           end
         else if (Components[i] is TLabel) then
           begin
             (Components[i] as TLabel).Font.Color := h;
           end
         else if (Components[i] is TEdit) then
           begin
             (Components[i] as TEdit).Color := k;
           end;
    end;
  finally
    ini.free;
  end;
end;
Im ChildForm dann einfach nur noch
Delphi-Quellcode:
Unit Child1;

...

implementation

uses
  FormControlCustomize;

procedure TfrChild.FormCreate( Sender : TObject );
begin
  CompFarbenSetzen( Self );
end;

Luckie 28. Nov 2011 10:11

AW: Form als Parameter übergeben
 
Kleiner Tipp: Variabelnnamen dürfen auch länger als ein Buchstabe sein. ;)

Sir Rufo 28. Nov 2011 10:19

AW: Form als Parameter übergeben
 
Zitat:

Zitat von Luckie (Beitrag 1138204)
Kleiner Tipp: Variabelnnamen dürfen auch länger als ein Buchstabe sein. ;)

Seit wann das denn? :mrgreen:

ConnorMcLeod 28. Nov 2011 10:40

AW: Form als Parameter übergeben
 
Zitat:

Zitat von Sir Rufo (Beitrag 1138201)
Eigentlich hat diese Funktionalität doch nichts mit der MainForm zu schaffen?
Warum also eine Methode in der MainForm, und nicht eine einfache procedure (in einer eigenen Unit)?

Hab ich mir auch gedacht, wollte aber nicht noch mehr Verwirrung stiften ;-)

jaenicke 28. Nov 2011 11:26

AW: Form als Parameter übergeben
 
Zitat:

Zitat von Luckie (Beitrag 1138204)
Kleiner Tipp: Variabelnnamen dürfen auch länger als ein Buchstabe sein. ;)

Aber das wäre doch schade, da hat man doch gar nichts zu raten. ;-)

Aleshi 28. Nov 2011 13:05

AW: Form als Parameter übergeben
 
Danke an Alle,

es funktioniert nun :-)

Vielen Dank für die vielen Tipps und die schnelle Hilfe!

Gruß Aleshi

Sir Rufo 28. Nov 2011 13:12

AW: Form als Parameter übergeben
 
Zitat:

Zitat von Aleshi (Beitrag 1138222)
es funktioniert nun :-)

Es wäre schön, wenn du jetzt noch hinterlassen würdest, wie du es genau umgesetzt hast, dann hätten auch alle etwas davon, die später einmal hier hereinschauen :)

Aleshi 29. Nov 2011 14:01

AW: Form als Parameter übergeben
 
Also,

ich hab das umgesetzt wie du es beschrieben hast hab aber eine kleinigkeit geändert.

Code:
  procedure CompFarbenSetzen(aOwner: TObject); //Hier von TComponet auf TObject geändert

implementation

procedure CompFarbenSetzen(aOwner: TObject); // Das Selbe hier auch
var ini: TIniFile;
    a : String;
Code:
   h := StrToInt( a );
    a := ini.ReadString('TEdit','Schriftfarbe','0');
    k := StrToInt( a );

    with aOwner as TForm do // hier "as TForm" ergänzt
    begin
       for i := 0 to ComponentCount -1 do
         if (Components[i] is TPanel) then
           begin
es hat schon vorher funktioniert aber für spätere Modifikationen muß ich das TObject nehmen

Nochmals vielen Dank!

DeddyH 29. Nov 2011 14:15

AW: Form als Parameter übergeben
 
Das macht aber keinen Sinn. Wenn aOwner nicht mindestens vom Typ TForm ist, läufst Du an der Stelle "as TForm" in eine Exception.

Sir Rufo 29. Nov 2011 14:18

AW: Form als Parameter übergeben
 
Wieso dass denn? :shock:

Form wird von TComponent abgeleitet
Nur TComponent hat wiederum die Eigenschaft Components

ist irgendwie nicht "Documentation by Code"

Denn irgendwer könnte ja auf die Idee kommen da tatsächlich mal ein einfaches schnödes TObject zu übergeben und wundert sich, warum das knallt.
Wenn der Zugriff auf die Quellen hat, dann sieht der, achso, ich darf da nur etwas übergeben was von Form abgeleitet ist.

Warum also nicht gleich so die procedure so definieren?

DeddyH 29. Nov 2011 14:20

AW: Form als Parameter übergeben
 
Sach ich ja :mrgreen:

Sir Rufo 29. Nov 2011 14:26

AW: Form als Parameter übergeben
 
Zitat:

Zitat von DeddyH (Beitrag 1138433)
Sach ich ja :mrgreen:

aber nicht so ausführlich :mrgreen:

Irgendwo gibt es doch so ein nettes Video, wo ein Programmierer neu in ein Unternehmen kommt und dort bestehenden Projekte weiter entwickelt.
Problematisch daran, dass er ständig "the old and wise" fragen muss, weil ihm ständig etwas um die Ohren fliegt ;)

Die haben ihre Bibliotheken auch so aufgebaut :mrgreen:


Schade, ich finde den Link gerade nicht ... ist aber auf jeden Fall sehenswert :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:25 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