Autor Beitrag
hRb
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: 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 user profile iconTh69: Titel geändert (war "Dialogfelder vererben, aber wie?").
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: 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

ausblenden volle Höhe Delphi-Quelltext
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}


procedure TForm1.FormCreate(Sender: TObject);
begin
  MyPageBox:=TPageSetupDialog.Create(nil);
  MyPrintBox:=TPrinterSetupDialog.Create(nil);
  Drucken.Parent := GroupBox1;
//  MyPageBox.Parent := GroupBox1;         //Compilerfehler: undeklarierter Bezeichner 'Parent'
  GroupBox1.InsertComponent(MyPageBox);    // so lässt es sich compilieren
  GroupBox1.InsertComponent(MyPrintBox);
end;

procedure TForm1.Button1Click(Sender: TObject);
// Dialogbox zeigen
begin
  GroupBox1.visible := true;
// ShowModal soll lt. Hilfe in Vcl.Forms.TCustomForm.ShowModal
  MyPageBox.ShowModal;    //Compilerfehler: undeklarierter Bezeichner 'ShowModal'
  MyPrintBox.ShowModal;
end;

procedure TForm1.DruckenClick(Sender: TObject);
//Dialog schließen, Drucken
begin
  GroupBox1.Visible := false;
  ...
end;

end.


Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 17.03.21 10:48 
Auch Sinspin scheint dein Vorhaben wohl falsch verstanden zu haben.

Dein Vorhaben ist technisch nicht umsetzbar.
hRb Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 17.03.21 11:53 
user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1321
Erhaltene Danke: 117

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Mi 17.03.21 16:55 
user profile iconhRb hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 267
Erhaltene Danke: 12



BeitragVerfasst: 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