AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Form überall wiederverwenden? Dafür Unit?
Thema durchsuchen
Ansicht
Themen-Optionen

Form überall wiederverwenden? Dafür Unit?

Ein Thema von TheMiller · begonnen am 26. Jan 2009 · letzter Beitrag vom 28. Jan 2009
Antwort Antwort
Seite 2 von 2     12   
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: Form überall wiederverwenden? Dafür Unit?

  Alt 28. Jan 2009, 09:11
@DJ-SPM: Vor dem Implementation-Teil deklariert man keine Variablen...
Zitat von DJ-SPM:
Delphi-Quellcode:
:
var
  fSettings: file of TSettings;
  dSettings: TSettings;
:
@Hansa: Wenn jetzt noch die unnötige, globale Variable rausfliegt, dann wird das langsam brauchbar...
Zitat von Hansa:
Delphi-Quellcode:
interface

uses
  StdCtrls, ComCtrls, DB, ZAbstractRODataset, ZAbstractDataset, ZDataset,
  ZConnection, Graphics, SysUtils, DumbCrypt, Messages, Dialogs, Forms,
  Classes, UNITTCONTACTFORM;

type
  TSearchContactForm = class(TContactForm)
    SearchField: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure SearchFieldKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  private

  public

  end;

  TSettings = record
    skin: String[100];
    color: TColor;
    boxcolor: TColor;
    logo: String[255];
    winstart: Boolean;
    host: String[100];
    port: Integer;
    Name: String[30];
    User: String[30];
    Pass: String[50];
  end;

function AssignConfigFile(filename: String): Boolean;
function InitDBConnection(ZConnection: TZConnection): Boolean;
function getSesstings:TSesstings;

implementation

var
  dSettings: TSettings;

function getSesstings:TSesstings;
begin
  Result:=dSettings;
end;

function AssignConfigFile(filename: String): Boolean;
var
  fSettings: file of TSettings;
begin
  {...}
end;

function InitDBConnection(ZConnection: TZConnection): Boolean;
begin
  {...}
end;

procedure TSearchContactForm.SearchFieldKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  ShowMessage('SD');
end;
Tja, was ist das ? Eine abgeleitete Form. Alles aus der Ursprumgs-Unit ist ja bereits bekannt. Es werden nur noch die Änderungen innerhalb der neuen Form extra neu deklariert. Das kann im OI gemacht werden und steht dann in der DFM.

Nun gut, ca. 2 Mausklicks, dann siehts (bei mir) so aus wie im Anhang. Erzeugter Quelltext :

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TfrmArtSuch1 = class(TfrmArtSuch)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

implementation

{$R *.dfm}

procedure TfrmArtSuch1.FormCreate(Sender: TObject);
begin
  inherited;

end;

end.
Das ist auch eine Suchform, die öfters und in diversen Projekten gebraucht wird. Das noch leere FormCreate kam eben hier dazu. Die Buttons etc. wurden schon im Vorgänger in Etwa richtig positioniert, die Schriftart auf fett gesetzt usw.
Aufruf:
Delphi-Quellcode:
procedure TForm1.ButtonClick(Sender:TObject);
var frmArtSuch1:TfrmArtSuch1;
begin
  frmArtSuch1:=TfrmArtSuch1.create(Self);
  try
    if frmArtSuch1.ShowModual = mrOK then begin
    end;
  finally
    frmArtSuch1.release;
  end;
end;
Somit wird die Form nur solange im Speicher gehalten, wie sie benötigt wird. Also so oft wie möglich "Verfügbare Formulare" anlegen "Automatisch erzeugen" nur dann wenn es unbedingt sein muss (und das heißt meistens: nur die Hauptform automatisch erzeugen)

So und jetzt könnt Ihr ja wieder auf mich eindreschen...
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#12

Re: Form überall wiederverwenden? Dafür Unit?

  Alt 28. Jan 2009, 09:29
Vielen Dank für eure Antworten. Gestern Abend habe ich es so gelöst, wie Hansa es gesagt hat. Ich habe mir ein Verzeichnis mit Formularen erstellt, eine Adress-Such-Form gebastelt und abgespeichert. Dann folgendermaßen in mein Projekt eingebunden:

Hauptprogramm
Delphi-Quellcode:
uses
  ..., uPJAdresssuche;

const
  WM_TAKEDATA = WM_USER + 100;
  WM_UNLOADFORM = WM_USER + 101;

procedure TForm2.TakeData(var msg:TMessage);
begin
  AdresseDbId:=msg.WParam;
  Edit1.Text:=uPJAdresssuche.Adressname;
  Edit2.Text:=uPJAdresssuche.Tel;
  Edit3.Text:=uPJAdresssuche.eMail;
  FreeAndNil(AdressForm);
end;

procedure TForm2.UnloadForm(var msg: TMessage);
begin
  FreeAndNil(AdressForm);
end;

procedure TForm2.PngSpeedButton1Click(Sender: TObject);
begin
  adressForm:=uPJAdresssuche.TfPJAdresssuche.Create(nil);
  uPJAdresssuche.ParentForm:=Form2;
  adressForm.Show;
end;
Damit das Formular nicht die ganze Zeit geöffnet bleibt, habe ich mich dafür entschieden, mit Messages zu arbeiten.

Wird das Form mit Auswahl einer Adresse oder durch Klick auf "zurück" beendet, wird dem ParentForm (Variable von TForm im Adress-Such-Formular) die Message WM_UNLOADFORM gesendet, woraufhin die aufrufende Form die Adress-Suche wieder freigibt. Ggf wird vorher eine Message gesendet, die der aufrufenden Form sagt "Du kannst dir die Daten abholen" (WM_TAKEDATA).

Ist der Weg über Messages in Ordnung, oder zu kompliziert? Ich kann ja nicht von der Adress-Suche auf Variablen in der "Aufruf-Form" zugreifen, wenn ich die Adresssuche mehrfache verwenden will. Ich dachte mir, so ist alles ein Stück flexibler, oder?

Warum ich das alles in einer Unit erledigen wollte hatte foglenden Grund: Ich wusste erst nicht so recht, was mit dem Repository gemeint war. Ich stand auf dem Schlauch. Aber jetzt finde ich die Idee so genial, weil es einfach so simpel und zugleich so hammer flexibel und schnell ist. Ärgere mich, warum ich auf sowas nicht komme.

Danke und Grüße
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#13

Re: Form überall wiederverwenden? Dafür Unit?

  Alt 28. Jan 2009, 12:53
Zitat von omata:
...So und jetzt könnt Ihr ja wieder auf mich eindreschen...
Wieso ? Du bist der einzige, zumindest mir bekannte, der kapiert hat, wie man das benutzt.

Irgendwo stand doch, man könne die Daten nicht übergeben oder sowas ? Wieso nicht ?

Delphi-Quellcode:
  frmArtSuch1 := TfrmArtSuch1.Create(self);
  frmArtSuch1.ShowModal;
  if frmArtSuch1.SucheDaten then with sgNr do begin
// bei mir : ermittelte Daten der Suchform (sofern vorhanden) im Grid anzeigen etc.
    frmArtSuch1.Close;
  end;
Nur wenn SucheDaten true ist wird die Suchform geschlossen. Ansonsten steht da 'nicht gefunden' und man kann neu suchen.

Na gut, wegen dem finally kriegst Du noch etwas Dresche. Im Normalfall reicht das :
Delphi-Quellcode:
procedure TKey.FormClose(Sender: TObject; var Action: TCloseAction);
begin
...
  Action := caFree;
end;
Und genau das steht ganz am Anfang der Form-Hierarchie. Somit kann man das bei eigenen Forms nie mehr vergessen.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#14

Re: Form überall wiederverwenden? Dafür Unit?

  Alt 28. Jan 2009, 16:22
Hm... mal sehen, ob ich das richtig verstanden habe. Hier nochmal dein Code:

Delphi-Quellcode:
begin
  frmArtSuch1 := TfrmArtSuch1.Create(self);
  frmArtSuch1.ShowModal;
  if (frmArtSuch1.SucheDaten) then
  begin
    with sgNr do
    begin
      // bei mir : ermittelte Daten der Suchform (sofern vorhanden) im Grid anzeigen etc.
    end;
  end;
  frmArtSuch1.Close;
end;
Wenn frmArtSuch1.SucheDaten true ist, dann hat der Benutzer schon einen einen eingegeben, eine Suche durchgeführt und die Ergebnisse liegen vor um sie irgendwo anzuzeigen. Richtig?

Doch woher weiß Form1 dass es warten soll, bis frmArtSuch1.SucheDate = true ist. Fehlt da nicht ein

Delphi-Quellcode:
while not (frmArtSuch1.SucheDaten) do
  Application.ProcessMessages
Aber ziere mich aber immer ein bisschen, diese while not-Schleife zu nutzen. Oder habe ich da was komplett falsch verstanden?
  Mit Zitat antworten Zitat
taaktaak

Registriert seit: 25. Okt 2007
Ort: Radbruch
1.990 Beiträge
 
Delphi 7 Professional
 
#15

Re: Form überall wiederverwenden? Dafür Unit?

  Alt 28. Jan 2009, 16:44
Moin, Moin.
man beachte das frmArtSuch1.ShowModal;
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#16

Re: Form überall wiederverwenden? Dafür Unit?

  Alt 28. Jan 2009, 16:46
Hm... das erklärt einiges. Ergänzed dazu aus der Delphi-Hilfe folgendes:

Zitat:
Da bei einem modalen Formular die Anwendung unterbrochen wird, bis der Benutzer das Fenster wieder schließt, gibt ShowModal die Steuerung erst nach dem Schließen des Formulars zurück.
Das wusste ich nicht.

Vielen Dank für eure Hilfen!
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#17

Re: Form überall wiederverwenden? Dafür Unit?

  Alt 28. Jan 2009, 17:36
Ihr vergesst, dass diese frmArtSuch1 auch Vorlagen hat. Zunächst nur direkt die frmArtSuch. Die neue ist also anfangs identisch mit der Vorlage. Aber nur bis dahin, als ich das FormCreate hinzugefügt habe. Die Vorlage kommt aber so zustande : TfrmArtSuch = class(TfrmSuch) Art steht für Artikel. Ich will aber nach mehr suchen und zwar in DB. Deshalb ist auch ein Dataset zu sehen. Wozu dient das wohl ? Tja, es gibt viele Tabellen in denen man was suchen muss. SucheDaten beinhaltet also die SQL-Statements (anfangs nur deklaliert). Resultat der Funktion ist : SucheDaten := not SuchDS.IsEmpty; Egal welche Suche, gemeinsam ist immer folgendes : es wird was gefunden, man ist zu weit/zu schnell, will zurück etc. Und deshalb ist das alles sehr früh eingebaut.

Delphi-Quellcode:
procedure TfrmSuch.btnEndeClick(Sender: TObject);
begin
  ModalResult := mrAbort;
end;

procedure TfrmSuch.btnGefundenClick(Sender: TObject);
begin
  ModalResult := mrOk;
end;
Ich bin doch nicht so blöd und mache das jeweils für Artikel, Adressen etc. alles wieder neu ?
Gruß
Hansa
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#18

Re: Form überall wiederverwenden? Dafür Unit?

  Alt 28. Jan 2009, 17:38
Man kann die Rückgabewerte auch direkt in die Eigenschaft .ModalResult der Buttons eintragen
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:54 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