AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Message Procedur mit textout

Ein Thema von Salomon · begonnen am 9. Jun 2002 · letzter Beitrag vom 10. Jun 2002
Antwort Antwort
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#1

Message Procedur mit textout

  Alt 9. Jun 2002, 17:00
Aha,
hier haben sich also einige User aus dem ehemaligen DF versteckt
Ist echt schade, das DAS Delphiforum nicht mehr existiert. Es wäre natürlich super wenn sich noch weitere alte User hier anmelden würden und eine ähnlich große und vor allem hilfsbereite Community entstehen würde.

Nun zu meinem Problem. Mit Luckies Hilfe habe ich vor einiger Zeit ein Konsolen Programm in nonVCl programmiert. Das Programmfenster bedeckt dabei den ganzen Bildschirm.
Nun wollte ich eine Message Procedure schreiben, der man text als String oder PChar übergeben kann, der dann mit Hilfe von textout auf das Fenster geschrieben werden soll. Dabei soll die Procedure nach jedem übergeben String eine neue Zeile anfange. Sind 10 Zeilen auf dem Bildschirm, sollen alle Zeilen eins weiter nach oben rücken, die obere wegfallen, und unten die neue hinzugefügt werden.
Mein Problem geht aber schon beim textout los, das geht nämlich bei mir nur in der WM_Paint Procedure so wie es sollte. Und das mit den 10 Zeilen Text habe ich auch noch nicht gelöst.
Hier schoneinmal ein Anfang:

Code:
procedure messageout (text : PChar);
var WndDC: HDC;
        ps: TPaintStruct;
begin
        WndDC := BeginPaint(hmain, ps);
        SetTextColor(WNdDC,RGB(140, 255, 0));
        SetBkMode(WNdDC, TRANSPARENT);
        textout (WndDC,10,10,text,length(text));
        EndPaint(hmain, ps);
end;
Das ist doch was für Luckie, den nonVCL Gott Bin übrigens über deine Seite hierher gekommen.

Mfg
Salomon
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2
  Alt 9. Jun 2002, 17:12
Schön, dass du über meine Seite hierhergefunden hast. Aber trozdem schreibe ich mich immer noch mit c: Luckie.

Nun, da muß man wohl etwas an der Logik basteln. Aber was spricht gegen ein Multiline-Edit oder eine Listbox?

Die 10 Zeilen mit TexOut bekommst du mit einer for-Schleife hin in der du immer die neue Postion in Abhängigkeit der Zählvariablen ermittelst. Die Strings packst du vorher in ein Array of String und sprichst sie mit der Zählvariable an.
Aber kuckt dir in diesem Zusammenhang mal DrawText an mit dem Flag DT_WORDWRAP oder wie der heißt, eventuell kommst du damit weiter. DrawText wäre so wie so vorzuziehen, da du mit den Flags mehr Formatierungsmöglichkleiten hast.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#3
  Alt 9. Jun 2002, 17:54
Luckie mit c sieht doch irgendwie besser aus, sorry. Ich habe es der Richtigkeithalber oben auch noch verbessert.

Ein Multiline-Edit oder eine Listbox wollte ich nicht verwenden, da der gesammte Bildschirm mit dem schwarzen Fenster ausgefüllt ist, und ich darauf später noch andere "Effekte" darstellen möchte.
Bei dem Draw Text blicke ich nicht ganz durch, muss ich da jedesmal diese Fill Rec Struktur ändern? Und warum funktioniert Textout nicht auserhalb von WM_PAINT?

Mfg Salomon
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4
  Alt 9. Jun 2002, 20:46
Es funktioniert schon außerhalb von WM_PAINT, du mußt dir nur mit GetDC() einen HDC für den Clientbereich deines Fensters holen (und nicht vergessen wieder mit DeleteDC() frei zu geben). Bloß das Problem wird sein, dass der Text wohl jedes mal verschwinden wird, wenn das Fenster neu gezeichent wird. Deswegen macht man so was in WM_PAINT, weil das Fenster jedesmal ein WM_PAINT bekommt, wenn es neu gezeichnet wird.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#5
  Alt 9. Jun 2002, 21:39
Ja, leider verschwindet der text sofort wieder.

Ich habe aber eine neue Idee. Kann man nicht ein Array of String global erstellen. Dieses Array wird dann über die Messageprozedur mit den benötigten TextMeldungen versorgt.
Im WM_PAINT Ereignis zeichnet man nun jedesmal alle 10 Zeilen aus dem Array auf das Fenster.
Wurde eine Textmeldung hinzugefügt, ändert die Messageprozedur die Reihenfolge der Textmeldungen im Array, fügt die neue Meldung unten an.
Danach wird eine WM_Paint Message an das Fenster geschickt, damit alles neu gezeichnet wird.
Sollte doch funktionieren oder? Nunja, werde ich morgen mal ausprobieren. Wenn einer hier einen Logikfehler sieht bitte posten, dann überleg ich mir was neues.

Mfg Salomon
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6
  Alt 10. Jun 2002, 01:03
Jupp, so müßte es gehen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:27 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