Autor |
Beitrag |
hRb
Beiträge: 267
Erhaltene Danke: 12
|
Verfasst: Mo 15.03.21 21:11
Hallo,
ich habe mich erstmals dem Thema "Vererben" zugewandt und durchblick es einfach nicht!
Meine Aufgabe klingt einfach: ich möchte ein neues Objekt TMyDruck mit
- TPageSetupDialog
- TPrintDialog und
- TSpeedButtom
auf ein Frame oder eine Form legen.
Scheitere dabei gleich an mehreren Fragen:
1. den Dialog-Objekten fehlen die Parameter Top, Left, Width, Height um sie auf der Form plazieren zu können.
2. die Dialogfelder sollen sich optisch "geöffnet" präsentieren: (Status Execute)
3. wird beim Aufruf das erste Objekt auf "Execute" gesetzt, dann stoppt das Programm, d.h. das zweite Dialogfeld wird nicht angezeigt.
Wer hilft mir Knoten für Knoten zu lösen? (oder hat jemand so etwas fertig?)
hRb
Moderiert von Th69: Titel geändert (war "Dialogfelder vererben, aber wie?").
|
|
Sinspin
Beiträge: 1322
Erhaltene Danke: 117
Win 10
RIO, CE, Lazarus
|
Verfasst: Mo 15.03.21 21:42
0. erstelle das form selber mit TWhatever.Create(nil)
1. Pack sie in ein Panel. Parent ist dann das Panel. bsNone, alClient
2. verwende Show zum anzeigen.
3. Nene, das wird nix. Dialoge die gezwungen Modal dargestellt werden (via ShowModal/Execute) stoppen alles andere wären wärend sie offen sind.
Bei Knoten nehme ich immer die Schere.
€:
Was das ganze jetzt mit Vererben zu tuen hat begreife ich aber nicht.
Das ist Einbetten von Formularen.
€2: Tippfehler entfernt, "d" fehlte.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Zuletzt bearbeitet von Sinspin am Mi 17.03.21 16:57, insgesamt 1-mal bearbeitet
|
|
hRb
Beiträge: 267
Erhaltene Danke: 12
|
Verfasst: Di 16.03.21 20:47
Hallo Sinspin,
der Wille ist da, allein mir fehlt ...
(Danke für Antwort, war mir als Anfänger "zu kompakt").
Hier mein "gescheiterter" Versuch. Habe statt Panel es mal mit einer Groupbox versucht. Die Box erscheint auch allerdings derzeit ohne die Dialogfelder. Folgende Fehler:
- der Speedbuttom 'Drucken' lässt sich der Box zuweisen mit
Drucken.Parent := GroupBox1;
- Nicht jedoch
MyPageBox.Parent := GroupBox1;
dafür geht's mit InsertComponent
- ShowModal erzeugt Compilerfehler, obwohl Vcl.Forms eingebunden
Nachstehender Code ist mal ein Anfang. Weiterhin bleibt offen wie man Dialogfelder positioniert.
Zitat: | Was das ganze jetzt mit Vererben zu tun hat begreife ich aber nicht. |
Um so besser, wenns ohne geht
hRb
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62:
| unit Unit1;
interface
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Buttons, Vcl.ExtCtrls, Vcl.StdCtrls, Printers ;
type TForm1 = class(TForm) Panel1: TPanel; Button1: TButton; Drucken: TSpeedButton; GroupBox1: TGroupBox; MyPageBox: TPageSetupDialog; MyPrintBox: TPrinterSetupDialog; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure DruckenClick(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin MyPageBox:=TPageSetupDialog.Create(nil); MyPrintBox:=TPrinterSetupDialog.Create(nil); Drucken.Parent := GroupBox1; GroupBox1.InsertComponent(MyPageBox); GroupBox1.InsertComponent(MyPrintBox); end;
procedure TForm1.Button1Click(Sender: TObject); begin GroupBox1.visible := true; MyPageBox.ShowModal; MyPrintBox.ShowModal; end;
procedure TForm1.DruckenClick(Sender: TObject); begin GroupBox1.Visible := false; ... end;
end. |
Moderiert von Th69: Delphi-Tags hinzugefügt
|
|
Th69
Beiträge: 4764
Erhaltene Danke: 1052
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Di 16.03.21 21:31
Bei den beiden Dialogen heißt die Methode Execute.
Bei anderen, von TCustomForm abgeleiteten Klassen, heißt sie ShowModal.
Jedoch kannst du nicht zwei Dialoge gleichzeitig modal anzeigen (sondern sie würden dann nacheinander aufgerufen werden).
Außerdem habe ich den Eindruck, daß du da etwas falsch verstanden hast: man kann die Dialoge nicht einbetten (z.B. in eine GroupBox), sondern sie erscheinen immer als eigenständige Dialogfenster (es sind ja Windows-Systemdialoge, keine mittels VCL erstellten Forms).
|
|
hRb
Beiträge: 267
Erhaltene Danke: 12
|
Verfasst: Di 16.03.21 22:51
Meinte, verstanden zu haben. Für meine derzeitige Drucken-Lösung habe ich im Mainmenü 3 Buttons:
1. Btn1 ruft PageDialog.execute auf (Einstellen von Ränder, Hoch/Quer)
2. Btn2 ruft PrintDialog.execute auf (Drucker auswählen, Druckbereich auswählen: alle Seiten, von..bis, markierten Bereich)
3. Btn3 startet Druckvorgang.
Manchmal vergisst man das eine, mal das andere. Das Problem wäre weg, wenn alles auf einer Form nebeneinander liegt. Habe aus der Antwort von Spinsin herausgelesen, dass dies mit Showmodal geht. Vielleicht nicht über eine Groupbox, eher über Form2
Zitat: | Jedoch kannst du nicht zwei Dialoge gleichzeitig modal anzeigen (sondern sie würden dann nacheinander aufgerufen werden). |
Wer hat nun recht?
Und was ist an den Aufrufen
Delphi-Quelltext 1: 2:
| MyPageBox.Showmodal; MyPrintBox.ShowModal; |
falsch, bzw. warum liefert der Compiler hier Fehler? Wäre interessant, was geschieht, wenn wenigstens das erste Dialogfenster angezeigt wird.
hRb
|
|
Th69
Beiträge: 4764
Erhaltene Danke: 1052
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 17.03.21 10:48
Auch Sinspin scheint dein Vorhaben wohl falsch verstanden zu haben.
Dein Vorhaben ist technisch nicht umsetzbar.
|
|
hRb
Beiträge: 267
Erhaltene Danke: 12
|
Verfasst: Mi 17.03.21 11:37
Hallo Th69,
wäre nicht auf die Idee gekommen, wenn es ein solches Bedienfeld nicht bei MS-Office schon ab V2010 gäbe. Die Dialogfelder von Embarcadero sind einfach schlecht. Aus beiden kann man den Druckvorgang nicht mit gutem Gewissen starten. Entweder ist der Drucker noch nicht ausgewählt oder der Seitenbereich. Was tun? Embarcadero bitten, ein neues Druck-Dialog-Objekt zu erstellen? Habe keine Kontakte. Vielleicht kann dies jemand übernehmen.
Danke für Antwort hRb
PS: warum sich MyPageBox.Showmodal nicht compilieren lässt bleibt offen.
|
|
Th69
Beiträge: 4764
Erhaltene Danke: 1052
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 17.03.21 11:53
hRb hat folgendes geschrieben : | PS: warum sich MyPageBox.Showmodal nicht compilieren lässt bleibt offen. |
Das habe ich dir doch geschrieben: die beiden von dir verwendeten Dialoge sind von TCommonDialog abgeleitet und dort heißt die Methode eben Execute (statt wie bei von TCustomForm abgeleiteten Forms ShowModal).
PS: Ich habe auch mal den Titel geändert.
Zuletzt bearbeitet von Th69 am Mi 17.03.21 12:01, insgesamt 2-mal bearbeitet
|
|
Ralf Jansen
Beiträge: 4701
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Mi 17.03.21 11:58
Zitat: | Embarcadero bitten, ein neues Druck-Dialog-Objekt zu erstellen? |
Wenn du etwas anderes brauchst als dir bereits zur Verfügung gestellt wird dann programmiere es?
Klingt nach Standardgeschäft als Entwickler das zu erschaffen was man braucht aber nicht existiert.
|
|
Sinspin
Beiträge: 1322
Erhaltene Danke: 117
Win 10
RIO, CE, Lazarus
|
Verfasst: Mi 17.03.21 16:55
hRb hat folgendes geschrieben : | Habe aus der Antwort von Spinsin herausgelesen, dass dies mit Showmodal geht. Vielleicht nicht über eine Groupbox, eher über Form2 |
Hmmm, erstmal ist das ein blöder Tippfehler, da fehlt ein "d".
Aber, ich habe es so verstanden dass du einen Dialog, der via Execute(oder ShowModal) angezeigt werden soll, in eine andere Form einbetten willst. Und das wird nix.
Drucken ist nach wie vor noch eine komplexe Sache.
Ich verwende eine Komponente zum drucken die die ganzen Dialoge mitbringt. Wenn Du das selber erledigen willst solltest du dir auch den Dialog dafür selber bauen.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
hRb
Beiträge: 267
Erhaltene Danke: 12
|
Verfasst: Do 18.03.21 00:27
Hallo Spinsin
Zitat: | Ich verwende eine Komponente zum Drucken die die ganzen Dialoge mitbringt. Wenn Du das selber erledigen willst solltest du dir auch den Dialog dafür selber bauen. |
1. Ok, erst mal erkenne ich, dass auch andere mit den vorhandenen Dialogen nicht zufrieden sind.
2. Bin Hobbyprogrammer, ohne die Möglichkeit einmal einen Kollegen zu fragen. Habe nur die EE als "Kollegen". Dachte, es müsste nicht jeder das Rad neu erfinden.
3. Ist es möglich, dass Du Deine Lösung hier einstellst? Selbst wenn noch einige spezifische Anpassungen notwendig werden, hätte ich einen "Leitfaden". Denn neue Dialoge mit eigenem (neuen) Eventhandler überfordert meine Fähigkeiten.
Hatte hier schon mehrfach vorgeschlagen, eine Ecke einzurichten mit Code-Bausteinen. Die Zeit hierfür scheint aber wohl abgelaufen, weil es immer weniger Anfänger gibt.
Zitat: | Drucken ist nach wie vor noch eine komplexe Sache. |
Das funktioniert bei mir bestens. Habe hierzu gerade vor 20 Tagen ein komplett lauffähiges Programm eingestellt (siehe: Richedit Drucken).
Gruß hRb
|
|
|