AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi DFM-Datei in anderem Programm als Vorschau anzeigen
Thema durchsuchen
Ansicht
Themen-Optionen

DFM-Datei in anderem Programm als Vorschau anzeigen

Ein Thema von Harry Stahl · begonnen am 16. Jul 2015 · letzter Beitrag vom 28. Feb 2016
Antwort Antwort
Seite 3 von 6     123 45     Letzte »    
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#21

AW: DFM-Datei in anderem Programm als Vorschau anzeigen

  Alt 22. Jul 2015, 22:46
Es ist nun mal so wie es ist.

Und bei der Zuweisung des Fonts passiert ein TFont.Assign . Und dort wird überprüft, ob die Instanz vom Typ TFont ist. Ist sie aber nicht (sieht man, wenn man sich den Referenzzeiger von TObject.ClassType anschaut.

Sehen gleich aus, heissen gleich, haben aber eine andere Referenz => ungleich und kein Assign möglich.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#22

AW: DFM-Datei in anderem Programm als Vorschau anzeigen

  Alt 22. Jul 2015, 22:56
So ein Mist...

Aber danke für die Erklärung.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#23

AW: DFM-Datei in anderem Programm als Vorschau anzeigen

  Alt 22. Jul 2015, 23:05
Eine Möglichkeit wäre noch, dass du dem Control in der DLL ein Panel zur Verfügung stellst und dann der DLL das Handle von dem Panel übergibst, dann kann das Control dort hingezeichnet werden.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#24

AW: DFM-Datei in anderem Programm als Vorschau anzeigen

  Alt 22. Jul 2015, 23:31
Vielen Dank für den Tipp. Werde ich morgen Abend auf jeden Fall mal ausprobieren, dass könnte zumindest eine Notlösung sein, wenn die anderen Ansätze, die ich mir überlegt habe, auch nicht funktionieren sollten...
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#25

AW: DFM-Datei in anderem Programm als Vorschau anzeigen

  Alt 23. Jul 2015, 21:02
Erfreulicherweise habe ich doch noch eine Möglichkeit gefunden, das Objekt in mein Formular zu übernehmen, mit CreateParented geht es:

Delphi-Quellcode:
function GetWinControlFromClass (ClassName: ShortString; InStream: TMemoryStream; AnOwner: TControl): TControl; stdcall;
var
  CRef: TPersistentClass;
  AControl: TControl;
  pn: TPanel;
begin
  Result := NIL;

  pn := Tpanel.CreateParented(TWinControl(AnOwner).handle); // That Rocks !!

  CRef := GetClass(String (ClassName));
  if CRef<>nil then
  begin
    AControl := TControl(TControlClass(CRef).Create(AnOwner));
    try

      AControl.Parent := pn;
      ReadComponent (AControl, Instream);
      //AControl.Parent := pn;

      pn.BevelOuter := bvNone;

      pn.Left := TWinControl (AControl).Left;
      pn.Top := TWinControl (AControl).Top;

      AControl.Left := 0;
      AControl.Top := 0;

      if ObjectHasProp (AControl, 'Width', tkInteger) then begin
        pn.AutoSize := True;
      end else begin
        pn.Width := 32;
        pn.Height := 32;
      end;

      pn.Visible := True;

      AControl.Visible := True;
      Result := TControl (pn);
    except
    end;
  end;
end;
Auf der Aufrufseite darf und braucht keine Parentzuweisung mehr erfolgen, daher kommt es auch nicht mehr zum Asign (TFont) usw. und alles funktioniert wie gewünscht (kleine Einschränkung, für das Objekt funktioniert kein Align). Kann das zurückgegebene Panel dann in die Form oder z.B. in ein anderes Panel einfügen.

Einzige Sache, die mich gerade etwas irritiert: Es funktioniert mit TEdit, TButton, TListBox, usw., aber nicht mit TSpeedButton.

Das TSpeedbutton-Objekt wird ordnungsgemäß erzeugt, aber nicht angezeigt. Warum nur (TSpeedButton ist natürlich als Klasse in der DLL registiert)?

Geändert von Harry Stahl (23. Jul 2015 um 21:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#26

AW: DFM-Datei in anderem Programm als Vorschau anzeigen

  Alt 23. Jul 2015, 21:20
Es ist doch schön, wenn man sich die Antworten selber geben kann:

Man benötigt statt des TPanels ein TForm, dann funktioniert alles wie gewünscht.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#27

AW: DFM-Datei in anderem Programm als Vorschau anzeigen

  Alt 23. Jul 2015, 21:25
Das mit den Klassen-Referenzen, die du da so austauschst ist schon hart an der Schmerzgrenze. Ich würde nur das Handle übergeben und zurück eher ein Interface.

Du kannst dir auch mal anschauen, wie man den PreviewHandler in Delphi einbindet. Denn da passiert eigentlich genau das gleiche.

Ich habe die Daten und den Platz zum Anzeigen und im System ist der PreviewHandler registriert der diese Daten auf dem zugewiesenen Platz darstellt.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#28

AW: DFM-Datei in anderem Programm als Vorschau anzeigen

  Alt 23. Jul 2015, 21:33
Das mit den Klassen-Referenzen, die du da so austauschst ist schon hart an der Schmerzgrenze. Ich würde nur das Handle übergeben und zurück eher ein Interface.
Kleine Bitte um Hilfestellung, da ich relativ unerfahren mit Interfaces bin: Wie würde man das machen? Interfaces dürften ja hier den Vorteil haben, dass ich hinterher nicht selber aufräumen muss?

Du kannst dir auch mal anschauen, wie man den PreviewHandler in Delphi einbindet. Denn da passiert eigentlich genau das gleiche.
Wo finde ich den PreviewHandler?

Ich habe die Daten und den Platz zum Anzeigen und im System ist der PreviewHandler registriert der diese Daten auf dem zugewiesenen Platz darstellt.
Das verstehe ich wahrscheinlich erst, wenn ich mir den PreviewHandler angesehen habe. Wobei ich mal vermute, dass ich dafür ein installiertes Delphi auf dem PC haben muss?

Wenn es also besser geht, gerne. Grundsätzlich bin ich schon mal froh, eine Variante zu haben, die (nach erstem Anschein) ganz gut funktioniert. Auch TMS-Komponenten konnte ich so auf diese Weise einbinden, sollte dann auch so mit allen anderen funktionieren.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#29

AW: DFM-Datei in anderem Programm als Vorschau anzeigen

  Alt 23. Jul 2015, 21:50
Der PreviewHandler hat nichts mit Delphi zu tun, sondern sorgt dafür, dass du im Explorer eine Vorschau sehen kannst (z.B. von einer PDF-Datei).

Diese müssen sich entsprechend registrieren und man könnte auch aus deinem Formular-Anzeiger einen PreviewHandler machen, der dann ganz einfach mit dem Windows Explorer funktioniert.

Hier die Definition des Interfaces
https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

Um diesen Preview (nach der Initialisierung) dann anzuzeigen, reicht es die Methode SetWindow aufzurufen, wo dann das ParentHandle und der Anzeigebereich übergeben wird. Dort zeichnet sich das dann hin.

Im Prinzip genau das was du auch machen willst. Du weisst wo es hin soll und hast auch den Bauplan, aber du weisst nicht wie du es bauen sollst und lässt das die DLL machen.

Ein Interface sollte man nicht nur auf die automatische Freigabe reduzieren.
Und nicht jedes Interface kann sich auch selber wieder freigeben. Das hat etwas mit der Implementierung zu tun.

Der grosse Vorteil hier ist, dass du die Interface-Referenz einfach so Anwendungsübergreifend austauschen kannst. Nur bei den Rückgabewerten und Parametern muss man ein Auga darauf haben, dass man keine Delphi-Typen (wie z.B. string) verwendet. Alternativ bietet sich da z.B. der WideString an. Ist zwar langsamer aber hier safe, da der von Windows direkt verwaltet wird (darum ja auch langsamer).

Beispiele sollten sich da finden lassen. Wenn nicht, dann schau ich mal ... irgendwo habe ich noch so ein Beispiel rumfliegen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#30

AW: DFM-Datei in anderem Programm als Vorschau anzeigen

  Alt 23. Jul 2015, 22:10
man könnte auch aus deinem Formular-Anzeiger einen PreviewHandler machen, der dann ganz einfach mit dem Windows Explorer funktioniert.
Da war doch mal was... Windows 7 Previews – the Delphi Way
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 6     123 45     Letzte »    


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 22:37 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