Einzelnen Beitrag anzeigen

Benutzerbild von arcticwolf
arcticwolf

Registriert seit: 3. Aug 2021
Ort: Erfurt
41 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Unit-übergreifende Sichtbarkeit von {$Define …} - geht das?

  Alt 26. Jul 2023, 23:16
Hallo Wolfgang,
danke für den Hinweis. Leider funktionier es bei mir noch nicht ganz korrekt. Im Anhang ist ein kleines Demo dazu.

PrintVektor(..) ist eine "alte" (= bestehende) Routine, die System.WriteLn(..) verwendet.
Auch wenn ich Console.Modes.UseAlternateWriteProc := False; einstelle, wird der lange Output von PrintVektor(..) gekappt, weil System.WriteLn(..) nicht in Console. WriteLnConsole(..) umgeleitet wird, was ich mit meiner ursprünglichen Idee mit der "Zwischen-Unit" realisieren wollte.
Hallo Andreas,

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:
Für die Ausgabe sollte/muss "WriteConsole" und/oder "WritelnConsole" verwendet werden, weil die normalen Ausgaben (Write/Writeln) auf feste Fenstergrößen abgestimmt sind

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:
Function CrtWriteAlternateConsole(var t: TTextRec; s: UnicodeString) : Pointer;
begin
  WriteConsole(s);
  Result := @t;
end;
2. System.AlternateWriteUnicodeStringProc auf deine Funktion umleiten
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" .

Das Ganze sieht dann in etwa so aus:

Delphi-Quellcode:
      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);
Das ist natürlich eine verkürzte Darstellung aber ich denke Du bekommst das hin.

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).
Wolfgang
coding is an art - code for people not for machines
  Mit Zitat antworten Zitat