![]() |
AW: Unit-übergreifende Sichtbarkeit von {$Define …} - geht das?
Zitat:
Mir ist schon vor langer Zeit beim durchsuchen von meinen, mit Delphi erzeugten, Binaries aufgefallen das da die ganzen Unit Namen drinne stehen. Einen Sinn habe ich darin nie gesehen. Ich verwende die Initialization Abschnitte auch nicht zum sammeln von Unit Namen, wozu auch ;-). Sondern zum registrieren von Funktionen oder Klassen für automatische Konverter/etc. |
AW: Unit-übergreifende Sichtbarkeit von {$Define …} - geht das?
Jupp, diese Liste wird benutzt, um beim Start alle Initialization und am Ende alle Finalization zu durchlaufen.
Aber dort stehen nicht ALLE Units drin, vor allem nicht, wenn sie weder Initialization/Finalization, Class-Constructor/Destructor oder globale Variablen haben, weil dann ist es ja nicht nötig was zu machen. Auch in den Ressourcen der EXE/DLL findet sich was, wo die Units aufgelistet werden. Dann die Debuginfos als PE-Section. Oder, wie schon gesagt, über ![]() |
AW: Unit-übergreifende Sichtbarkeit von {$Define …} - geht das?
Zitat:
|
AW: Unit-übergreifende Sichtbarkeit von {$Define …} - geht das?
Zitat:
|
AW: Unit-übergreifende Sichtbarkeit von {$Define …} - geht das?
Du baust also extra einen Code, der speziell nach dieser Unit sucht (oder Irgendeiner, die zufällig gleich heißt, aber was ganz Anderes ist),
um mit dieser Info dann was zu machen. Warum dann nicht diese Info direkt reinschreiben? Wenn, dann wäre es besser, wenn der Entwickler eine standardisierte Credits-Ressource bei legt, oder z.B. ein standardisiertes Credits-Attribut an seine Unit/Klasse/Sonstwas hängt, die man dann leicht finden könnte. |
AW: Unit-übergreifende Sichtbarkeit von {$Define …} - geht das?
Zitat:
|
AW: Unit-übergreifende Sichtbarkeit von {$Define …} - geht das?
Zitat:
Du denkst da ein bisschen kompliziert, eine ganze Unit brauchst Du dafür nicht ;-). Vorab mal ein paar Fragen/Hinweise: - Brauchst Du wirklich eine Zeilenlänge von 1.200 Zeichen und 15.000 Zeilen? -> Console.Buffer(10*120,10*1500, True); :? - Du solltest beim Start immer die Größe des Konsolenfensters also den sichtbaren Bereich festlegen, z.B. auf 120 x 50 mit Console.Window(120,50). Sonst nimmt Windows einen Wert aus der Registry und der kann wenn deine Anwendung mal auf einem anderen Rechner läuft ein ganz anderer sein. - In der Funktion "PrintVektor" verwendest Du System.Writeln, für die Ausgabe der Zeilen Crt.WritelnConsole. Wie ich im anderen Beitrag geschrieben habe, geht dieser Mix nicht. Zitat:
Wenn Du also diesen Ansatz (Vergrößerung des Puffers) verfolgen möchtest, dann leite doch einfach "System.Write & System.Writeln" direkt auf die Crt.WriteConsole um. 1. Eigene Funktion erstellen
Delphi-Quellcode:
2. System.AlternateWriteUnicodeStringProc auf deine Funktion umleiten
Function CrtWriteAlternateConsole(var t: TTextRec; s: UnicodeString) : Pointer;
begin WriteConsole(s); Result := @t; end;
Delphi-Quellcode:
AlternateWriteUnicodeStringProc := @CrtWriteAlternateConsole;
Fertig ist der Zauber. Dann ist es auch egal ob du Writeln oder WritelnConsole verwendest, abgesehen davon, dass der direkte Aufruf von WritelnConsole natürlich schneller ist als der Umweg über System.Writeln. Ja OK, hört sich jetzt trivial an, ist es auch, zumindest für Dich. Die Arbeit im Hintergrund übernimmt dann automatisch meine "Console Library" 8-). Das Ganze sieht dann in etwa so aus:
Delphi-Quellcode:
Das ist natürlich eine verkürzte Darstellung aber ich denke Du bekommst das hin.
AlternateWriteUnicodeStringProc := @CrtWriteAlternateConsole;
Textcolor(Yellow); TextBackground(Blue); Console.Font.SetDefault; Console.Window(120,50); EnlageBufferSize; FillVektor(Vektor, 2); PrintVektor(Vektor, 'Vektor'); For Zeile:= 1 To 200 Do Begin WriteLnConsole('Zeile[' + Zeile.ToString.PadLeft(3) + ']'); End; Console.ReadkeyScroll(Key); Disclaimer: Das mit dem vergrößertem Puffer und WriteConsole ist von mir weder getestet noch im produktivem Einsatz gewesen. Das war/ist nur eine Idee von mir wie du ein Problem lösen könntest. Ich würde mich jedoch über Berichte freuen, ob das stabil läuft oder ob es Probleme gibt. Gerne auch per PM oder E-Mail (findest Du auf GitHub). |
AW: Unit-übergreifende Sichtbarkeit von {$Define …} - geht das?
Vielen herzlichen Dank für Deine & Eure Unterstützung & Erläuterungen! :thumb: :thumb: :thumb:
"Kaum macht man es richtig, schon klappt es." :-D Es tut mir leid, daß ich Eure Zeit mit meinem Kinderkram verplempere... :oops: |
AW: Unit-übergreifende Sichtbarkeit von {$Define …} - geht das?
Zitat:
(Hint: Ein Quote hätte hier Klarheit geschaffen.) Da die Entwickler diese Ressource nicht zur Verfügung stellen und ich nicht an deren Code rumfummeln will, war die Suche nach einer Unit, die beim Einbinden einer Bibliothek immer vorhanden ist, die einfachste Lösung. Und da die meisten Bibliotheken ein individuelles Prefix im Unit-Namen verwenden, ist das auch ziemlich eindeutig. |
AW: Unit-übergreifende Sichtbarkeit von {$Define …} - geht das?
Das bezog sich eigentlich auf "alle" Entwickler von Komponenten :)
Und wie schon erwähnt, kannst'e bei vielen Komponenten auch nach einer derer Ressourcen suchen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:47 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