![]() |
Form überall wiederverwenden? Dafür Unit?
Hallo,
ich glaube, der Titel ist ein bissl blöd, aber mir fiel nicht besseres ein. Mein Anliegen ist folgendes: Ich programmiere ziemlich viele verschiedene Anwendungen für verschiedene Leute und auch Firmen. Dazu habe ich natürlich einmal eine Basis entwickelt und passe die Programme dann nur noch an. Nun habe ich eine Unit erstellt, die viele Funktionen, die ich oft benötige enthält. Jetzt merke ich, dass ich oft Adressen suchen und anzeigen lassen muss. Ohne jetzt viel Aufwand zu betreiben, würde ich die Unit um eine Prozedur erweitern, die eine neue Form erstellt. Auf diese kann man dann die Adressen suchen und auswählen. Ist das ok so? Ich habe schon ein Plugin-System, welches auf DLL-Forms basiert. Eine DLL-Form möchte ich dazu nicht benutzen, da es - gerade bei kleineren Programmen - bequemer ist, einfach nur diese Unit einzubinden. Ist dieses Vorhaben so ok? |
Re: Form überall wiederverwenden? Dafür Unit?
Ich wüsste auf die Schnelle nichts, was dagegenspräche.
|
Re: Form überall wiederverwenden? Dafür Unit?
Zitat:
es funktioniert und was funktioniert ist OK :roll: du kannst ja auch innerhalb eines Projektes die Units (auch welche mit Forms drin) in verschiedene Verzeichnisse verteilen ... und ob das nun ein gemeinsames Verzeichnis (für verschiedene Anwendungen) ist, ist dabei egal |
Re: Form überall wiederverwenden? Dafür Unit?
Gut. Dann bedanke ich mich und lege mal los:
Danke! |
Re: Form überall wiederverwenden? Dafür Unit?
Zitat:
Edit : himitsu nicht genau gelesen : wer in der Lage ist, das bis zu einem gewissen Grad allgemeingültig zu halten, der benutzt für eventuell zig Programme ein gemeinsames Vorlagen-Verzeichnis. Repository (= Vorratsraum, Lagerraum :gruebel: ) ist wesentlich besseres Wort, als Objektablage. Dort lagern dann diverse Forms und bei neuem Projekt fischt man sich das am Besten passende als Vorlage da raus. Da ist möglicherweise immense Zeitersparnis drin. Einmal machen, einmal austesten und immer wieder verwenden ! |
Re: Form überall wiederverwenden? Dafür Unit?
Danke für die Antwort.
Aber was genau meinst du mit Auslagern? Wie mache ich das? Habe das glaub ich nicht ganz verstanden. Die Unit könnte ich doch überall einbinden und von dem Formobjekt ein neues Form ableiten etc... wo ist der UNterschied? |
Re: Form überall wiederverwenden? Dafür Unit?
Was wohin auslagern ? :shock: Ich lege mir lediglich einen Vorratsraum (Verzeichnis) an, in dem alle sinnvollen Formulare für eigene Projekte zur möglichen Wiederverwendung gespeichert werden. Dieser Raum wird immer mehr bestückt. Also : neue Komponenten, neue Events, wobei immer das bereits vorhandene benutzt wird und fertig.
Zitat:
|
Re: Form überall wiederverwenden? Dafür Unit?
Die Unit kann ich gerne mal zeigen. Aber allerdings erst morgen abend. Vorher habe ich leider keine Zeit...
Danke und bis dann! |
Re: Form überall wiederverwenden? Dafür Unit?
Hallo,
hier mal meine Unit "ProgUtils". (Sie ist eine Library für Codestücke, die ich im ganzen Programm (mehrere PlugIns (DLLForms)) immer wieder verwende)
Delphi-Quellcode:
unit ProgUtils;
interface uses StdCtrls, ComCtrls, DB, ZAbstractRODataset, ZAbstractDataset, ZDataset, ZConnection, Graphics, SysUtils, DumbCrypt, Messages, Dialogs, Forms, Classes; function AssignConfigFile(filename: String): Boolean; function InitDBConnection(ZConnection: TZConnection): Boolean; type TSearchContactForm = class(TForm) 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; var fSettings: file of TSettings; dSettings: TSettings; implementation function AssignConfigFile(filename: String): Boolean; begin {...} end; function InitDBConnection(ZConnection: TZConnection): Boolean; begin {...} end; procedure TSearchContactForm.SearchFieldKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin ShowMessage('SD'); end; procedure TSearchContactForm.FormCreate(Sender: TObject); var Form1: TForm; SearchField: TEdit; begin Form1:=TSearchContactForm.Create(nil); with Form1 do begin Left:=202; Top:=111; BorderStyle:=bsNone; Caption := 'Adresssuche'; ClientHeight := 543; ClientWidth := 655; Color := clWhite; Font.Color := clWindowText; Font.Height := -11; Font.Name := 'MS Sans Serif'; Font.Style := []; KeyPreview := True; OldCreateOrder := False; PixelsPerInch := 96; end; SearchField:=TEdit.Create(nil); with SearchField do begin Left := 64; Top := 16; Width := 225; Height := 21; TabOrder := 1; //SearchField:=SearchFieldKeyDown(nil); end; end; end. |
Re: Form überall wiederverwenden? Dafür Unit?
Liste der Anhänge anzeigen (Anzahl: 1)
War so in etwa zu erwarten. Alles ist zur Not doppelt und dreifach vorhanden und fest im Quelltext verankert. Die IDE wird dadurch in großen Teilen unbrauchbar gemacht. Bitte gucken (nicht ganz klares blieb stehen) :
Delphi-Quellcode:
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.
interface
uses StdCtrls, ComCtrls, DB, ZAbstractRODataset, ZAbstractDataset, ZDataset, ZConnection, Graphics, SysUtils, DumbCrypt, Messages, Dialogs, Forms, Classes, UNITTCONTACTFORM; function AssignConfigFile(filename: String): Boolean; function InitDBConnection(ZConnection: TZConnection): Boolean; 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; N ame: String[30]; User: String[30]; Pass: String[50]; end; var fSettings: file of TSettings; dSettings: TSettings; frmSearchContactForm: TfrmSearchContactForm; // erzeugt durch Datei -> neu -> andere ... implementation function AssignConfigFile(filename: String): Boolean; begin {...} end; function InitDBConnection(ZConnection: TZConnection): Boolean; begin {...} end; procedure TSearchContactForm.SearchFieldKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin ShowMessage('SD'); end; Nun gut, ca. 2 Mausklicks, dann siehts (bei mir) so aus wie im Anhang. Erzeugter Quelltext :
Delphi-Quellcode:
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.
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; var frmArtSuch1: TfrmArtSuch1; implementation {$R *.dfm} procedure TfrmArtSuch1.FormCreate(Sender: TObject); begin inherited; end; end. [edit=Luckie]Anhang ausgetauscht. Mfg, Luckie[/edit] |
Re: Form überall wiederverwenden? Dafür Unit?
@DJ-SPM: Vor dem Implementation-Teil deklariert man keine Variablen...
Zitat:
Zitat:
Delphi-Quellcode:
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)
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; So und jetzt könnt Ihr ja wieder auf mich eindreschen... |
Re: Form überall wiederverwenden? Dafür Unit?
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:
Damit das Formular nicht die ganze Zeit geöffnet bleibt, habe ich mich dafür entschieden, mit Messages zu arbeiten.
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; 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 |
Re: Form überall wiederverwenden? Dafür Unit?
Zitat:
Irgendwo stand doch, man könne die Daten nicht übergeben oder sowas ? Wieso nicht ? :gruebel:
Delphi-Quellcode:
Nur wenn SucheDaten true ist wird die Suchform geschlossen. Ansonsten steht da 'nicht gefunden' und man kann neu suchen.
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; Na gut, wegen dem finally kriegst Du noch etwas Dresche. Im Normalfall reicht das :
Delphi-Quellcode:
Und genau das steht ganz am Anfang der Form-Hierarchie. Somit kann man das bei eigenen Forms nie mehr vergessen.
procedure TKey.FormClose(Sender: TObject; var Action: TCloseAction);
begin ... Action := caFree; end; |
Re: Form überall wiederverwenden? Dafür Unit?
Hm... mal sehen, ob ich das richtig verstanden habe. Hier nochmal dein Code:
Delphi-Quellcode:
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?
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; Doch woher weiß Form1 dass es warten soll, bis frmArtSuch1.SucheDate = true ist. Fehlt da nicht ein
Delphi-Quellcode:
Aber ziere mich aber immer ein bisschen, diese while not-Schleife zu nutzen. Oder habe ich da was komplett falsch verstanden?
while not (frmArtSuch1.SucheDaten) do
Application.ProcessMessages |
Re: Form überall wiederverwenden? Dafür Unit?
Moin, Moin.
man beachte das
Delphi-Quellcode:
frmArtSuch1.ShowModal;
|
Re: Form überall wiederverwenden? Dafür Unit?
Hm... das erklärt einiges. Ergänzed dazu aus der Delphi-Hilfe folgendes:
Zitat:
Vielen Dank für eure Hilfen! |
Re: Form überall wiederverwenden? Dafür Unit?
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 :
Delphi-Quellcode:
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 :
TfrmArtSuch = class(TfrmSuch)
Delphi-Quellcode:
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.
SucheDaten := not SuchDS.IsEmpty;
Delphi-Quellcode:
Ich bin doch nicht so blöd und mache das jeweils für Artikel, Adressen etc. alles wieder neu ? :shock:
procedure TfrmSuch.btnEndeClick(Sender: TObject);
begin ModalResult := mrAbort; end; procedure TfrmSuch.btnGefundenClick(Sender: TObject); begin ModalResult := mrOk; end; |
Re: Form überall wiederverwenden? Dafür Unit?
Man kann die Rückgabewerte auch direkt in die Eigenschaft .ModalResult der Buttons eintragen
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 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