![]() |
Delphi-Version: XE5
Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Hallo Delphi Community,
da ich fast ausschließlich reine technische Berechnungen OHNE visuelle Komponenten programmiere, stoße ich mit folgender Aufgabenstellung leider an meine Grenzen: Eine Berechnungsroutine ist über eine DLL in Excel eingebunden und erledigt umfangreiche Berechnungen und übergibt diese an Excel. So weit, so gut. Nun möchte ich innerhalb obiger NICHT-visueller Berechnungsroutine ein Editor-Fenster oder Memo-Fenster etc. zur Anzeige von Zwischenergebnissen zur Laufzeit aufmachen. Wie läßt sich das bewerkstelligen? Vielen Dank für Eure Hilfe im Voraus! Gruß Andreas |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Vielleicht hilft dir diese Bibliothek:
![]() Die ist noch im Anfangsstadium, funktioniert aber schon. Und du kannst die Anzeige direkt aus einem Berechnungsthread aktualisieren. |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Würde es auch ein Konsolenfenster tun?
|
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Ein Konsolenfenster aus Excel heraus als Anzeige fände ich relativ unüblich. Möglich ist natürlich alles.
|
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Hallo Sebastian,
danke für den Tipp, aber leider konnte ich ihn (noch) umsetzen... Mein Problem ist, daß meine Anwendung OHNE jedes Fenster läuft: es ist eine reine Berechnungsreoutine, die still und heimlich Excel mit Ergebnissen füttert. Ich bräuchte lediglich ein Fester wie z.B. die MessageBox(..), wo ich viele Zwischenergebnisse anzeigen und das Fenster danach wieder schließen / löschen kann. Gruß Andreas |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Deshalb vermute ich ja, dass es damit gehen könnte, da das damit nicht über die VCL läuft. Denn die wäre in einer solchen DLL eventuell etwas zickig (es könnte aber auch gehen).
|
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Zitat:
gruss |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Zitat:
|
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Zitat:
gruss |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Hallo,
sobald du bei einem Fenster bist, ist es ja nicht mehr non VCL. Such hier mal nach SemiModal. Aber damit bist du bei der VCL. |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Zitat:
Das hat nichts damit zu tun ob man ein Fenster erstellt oder nicht. gruss |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Zitat:
Zitat:
|
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Zitat:
Ich bezog mich darauf das er meint wenn ein Fenster erzeugt wird das es nicht mehr Non VCL ist! Bitte nochmals lesen. btw.. du verwendest die VCL in deinem Github projekt das ist nicht mehr nonvcl. Siehe Classes. gruss |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Zitat:
|
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Zitat:
Zitat:
|
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Zitat:
Zuerst mal: es ist kein Problem, in einer DLL die VCL zu verwenden, solange Du nur modale Fenster anzeigst. Die haben ihre eigene Message loop und sind somit unabhängig von der message loop der Hostanwendung. Mein Vorschlag wäre also folgendes:
Es gibt da noch ein potentielles Problem mit der Z-Order. Um das Meldungsfenster zuverlässig oberhalb des Excel-Fensters zu lassen solltest Du den formstyle auf fsTopMost setzen, oder die CreateParams-Methode überschreiben und params.wndParent auf den Rückgabewert von GetForegroundWindow setzen. |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Zitat:
|
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Zitat:
![]() |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Zitat:
Dann kann man direkt aus einem Berechnungsthread etwas in die Anzeige schreiben und die Anzeige läuft auch weiter, wenn der Hauptthread beschäftigt ist. |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Wenn es nur darum geht, um zu gucken was die Berechnung machen (als Log/Debugging), dann würde sich immer noch ein Konsolenfenster anbieten.
|
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Ich habe das als Statusanzeige für den Enduser verstanden. Und da finde ich ein Konsolenfenster in der heutigen Zeit weniger sinnvoll.
Aber wie dem auch sei, erst einmal geht es darum überhaupt etwas zu sehen, egal wie. |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Zusammen,
danke für Eure bisherigen Reaktionen und die für mich sehr lehrreiche Diskussion. Ich habe für Euch eine kleine Demo vorbereitet. Diese besteht aus zwei Dateien: 1): DLL_for_Excel_Test_0.dll 2): DLL_for_Excel_Test_0.xlsm Beide befinden sich gezippt in: DLL_for_Excel_Test_0.zip In der Excel-Datei gibt es auch einige Hinweise für die Benutzung. Danke! Viele Grüße Andreas |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Sorry, habe zuvor den Quellcode vergessen:
Delphi-Quellcode:
Library DLL_for_Excel_Test_0;
{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss die erste Unit in der USES-Klausel Ihrer Bibliothek UND in der USES-Klausel Ihres Projekts (wählen Sie 'Projekt-Quelltext anzeigen') sein, wenn Ihre DLL Prozeduren oder Funktionen exportiert, die Strings als Parameter oder Funktionsergebnisse übergeben. Dies gilt für alle Strings, die an oder von Ihrer DLL übergeben werden, auch für solche, die in Records und Klassen verschachtelt sind. ShareMem ist die Interface-Unit zur gemeinsamen BORLNDMM.DLL-Speicherverwaltung, die zusammen mit Ihrer DLL weitergegeben werden muss. Übergeben Sie String-Informationen mit PChar- oder ShortString-Parametern, um die Verwendung von BORLNDMM.DLL zu vermeiden. } uses System.SysUtils , System.Classes , WinAPI.Windows ; {$R *.res} TYPE ExcelDouble = Double; {8 Bytes für diese 32-Bit-DLL} ExcelBoolean = WordBool; {2 Bytes für diese 32-Bit-DLL} Procedure Zwischenwerte_Anzeigen(Text1: String); VAR S : String; Begin S:= 'Das ist ein provisorisches Anzeigefenster für optionale Zwischenergebnisse, ' + #13; S:= S + 'die nicht unbedingt nötig sind, oder welche Excel gar NICHT darstellen kann.' + #13; S:= S + 'Das können z. B. umfangreiche Vektoren, Matrizen etc. sein oder aber auch Ergebnisse, die mit '; S:= S + 'Multipräzisions-Arithmetik auf 75 .. 150 Ziffern genau ermittelt wurden' + #13 + #13; S:= S + 'Momentan wird dieser Text behelfsweise mittels WinAPI.Windows.MessageBox(..) dargestellt, weil ich ... '; S:= S + 'zu meiner Schade gestehen muß, daß ich nicht weiß, wie hier ich anstelle der MessageBox(..) z.B. ein '; S:= S + 'Memo-Fenster aufmachen kann.' + #13 + #13; S:= S + 'Vielleicht kannst DU mir dabei helfen???? Danke im Voraus!' + #13; S := S + 'Gruß, Andreas' + #13 + #13; S := S + Text1 + #13; MessageBox(0, PChar(S), 'Provisorische Notlösung...!', MB_OK); End; {Zwischenwerte_Anzeigen} {---------------------------} Function Komplizierte_Berechnung(a, b: ExcelDouble; Zwischenwerte: ExcelBoolean = True): ExcelDouble; StdCall; // Test zum Demonstrieren: Result := a*b; Begin Try Result:= a*b; IF Zwischenwerte Then Begin Zwischenwerte_Anzeigen('Zwischenergebnis für den User= 1.2345678901234567890ABCDEFGHIJ123452345678901234567890ABCDEFGHIJ12345'); Result:= a*b; Exit; End; Except Exit; End; End;{Komplizierte_Berechnung} {---------------------------} Exports Komplizierte_Berechnung ; Begin End. |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Sorry, habe zuvor den Quellcode vergessen:
Delphi-Quellcode:
Library DLL_for_Excel_Test_0;
{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss die erste Unit in der USES-Klausel Ihrer Bibliothek UND in der USES-Klausel Ihres Projekts (wählen Sie 'Projekt-Quelltext anzeigen') sein, wenn Ihre DLL Prozeduren oder Funktionen exportiert, die Strings als Parameter oder Funktionsergebnisse übergeben. Dies gilt für alle Strings, die an oder von Ihrer DLL übergeben werden, auch für solche, die in Records und Klassen verschachtelt sind. ShareMem ist die Interface-Unit zur gemeinsamen BORLNDMM.DLL-Speicherverwaltung, die zusammen mit Ihrer DLL weitergegeben werden muss. Übergeben Sie String-Informationen mit PChar- oder ShortString-Parametern, um die Verwendung von BORLNDMM.DLL zu vermeiden. } uses System.SysUtils , System.Classes , WinAPI.Windows ; {$R *.res} TYPE ExcelDouble = Double; {8 Bytes für diese 32-Bit-DLL} ExcelBoolean = WordBool; {2 Bytes für diese 32-Bit-DLL} Procedure Zwischenwerte_Anzeigen(Text1: String); VAR S : String; Begin S:= 'Das ist ein provisorisches Anzeigefenster für optionale Zwischenergebnisse, ' + #13; S:= S + 'die nicht unbedingt nötig sind, oder welche Excel gar NICHT darstellen kann.' + #13; S:= S + 'Das können z. B. umfangreiche Vektoren, Matrizen etc. sein oder aber auch Ergebnisse, die mit '; S:= S + 'Multipräzisions-Arithmetik auf 75 .. 150 Ziffern genau ermittelt wurden' + #13 + #13; S:= S + 'Momentan wird dieser Text behelfsweise mittels WinAPI.Windows.MessageBox(..) dargestellt, weil ich ... '; S:= S + 'zu meiner Schade gestehen muß, daß ich nicht weiß, wie hier ich anstelle der MessageBox(..) z.B. ein '; S:= S + 'Memo-Fenster aufmachen kann.' + #13 + #13; S:= S + 'Vielleicht kannst DU mir dabei helfen???? Danke im Voraus!' + #13; S:= S + 'Gruß, Andreas' + #13 + #13; S:= S + Text1 + #13; MessageBox(0, PChar(S), 'Provisorische Notlösung...!', MB_OK); End; {Zwischenwerte_Anzeigen} {---------------------------} Function Komplizierte_Berechnung(a, b: ExcelDouble; Zwischenwerte: ExcelBoolean = True): ExcelDouble; StdCall; // Test zum Demonstrieren: Result := a*b; Begin Try Result:= a*b; IF Zwischenwerte Then Begin Zwischenwerte_Anzeigen('Zwischenergebnis für den User= 1.2345678901234567890ABCDEFGHIJ123452345678901234567890ABCDEFGHIJ12345'); Result:= a*b; Exit; End; Except Exit; End; End;{Komplizierte_Berechnung} {---------------------------} Exports Komplizierte_Berechnung ; Begin End. |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Liste der Anhänge anzeigen (Anzahl: 1)
Sorry,
habe zuvor den Quellcode für die DLL vergessen! Siehe Anhang: DLL_for_Excel_Test_0.dpr Gruß, Andreas |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Du könntest auch OutputDebugString verwenden, und dann einfach DebugView starten:
![]() Gruss, Jörn |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Zitat:
Gruß, Andreas |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Liste der Anhänge anzeigen (Anzahl: 1)
So recht verstehe ich das Problem nicht. Es funktioniert mit der threadbasierten Lösung von mir genauso wie mit einem stinknormalen VCL-Formular. Beispiel mit einem VCL-Fenster siehe Anhang (für einen vollen Zeilenumbruch musst du den noch zu dem Windows-Zeilenumbruch ändern, sprich z.B. die Konstante sLineBreak nutzen, statt nur #13 zu benutzen).
|
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Zitat:
Noch eine Frage bitte: Was müsste ich an Deiner Lösung modifizieren, wenn ich dasselbe Memo-Fenster in einer reinen Konsolenanwendung benutzen möchte? Oder geht es gar nicht, sondern nur über WinAPI-Routinen? Gruß, Andreas |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Zitat:
danke für den Tipp, aber die Lösung von Sebastian ist die einfachste für meine Aufgabenstellung! Gruß, Andreas |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Zitat:
Delphi-Quellcode:
program Project28;
uses Vcl.Forms, Unit28 in 'Unit28.pas' {Form28}; {$APPTYPE CONSOLE} // <-- diese Zeile kommt dazu {$R *.res} begin Application.Initialize; Application.MainFormOnTaskbar := True; Application.CreateForm(TForm28, Form28); Application.Run; end. |
AW: Editor-Fenster oder Memo-Fenster in einer NICHT-visuellen Routine?
Danke für alle Beiträge & Diskussionen! Habe viel von Euch gelernt.
Gruß, Andreas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:58 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 by Thomas Breitkreuz