Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   TAboutScroller Fensterklasse [nonVCL] (https://www.delphipraxis.net/50271-taboutscroller-fensterklasse-%5Bnonvcl%5D.html)

Olli 22. Jul 2005 19:12


TAboutScroller Fensterklasse [nonVCL]
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin,

habe da eine Sache, die ich im Rahmen von EDA in der About-Box hatte, für Luckie nachbearbeitet und stelle es jetzt mal - spontan wie ich bin :mrgreen: - hier rein.

Die Fensterklasse - nicht VCL-Klasse, Komponente, oder Klasse im Sinne von OOP - erlaubt es, diesen Scroller in einer Dialogbox, oder wahlweise auch einem beliebigen anderen Fenster, zu benutzen.

Da die Unit bereits initialisiert wird, bevor der "begin end."-Teil des Programms beginnt, muß man sich als Nutzer keine Gedanken darüber machen, ob die Fensterklasse bereits registriert ist. Daher kann der TAboutScroller sogar direkt in eine Dialogressource eingefügt werden.

Weitere Klassen werden vermutlich in dieser Unit folgen (für Hyperlink und schickere Buttons), aber das braucht noch. Aktuell habe ich einfach anderes um die Ohren.

Die Fensterklasse macht nichts weiter, als einen Text in in seinem Clientbereich zu scrollen. Dabei kann Farbe, Hintergrundfarbe, Font (und Größe) sowie Geschwindigkeit über Fensternachrichten festgelegt werden. Der Rest ist so ziemlich selbsterklärend. Wer eine Demo sehen will, möge sich die Aboutbox von Luckies XP Usermanager ansehen.

Sollte Support direkt von mir unabdingbar sein, so fragt in meinem Forum; ansonsten fragt hier in der DP.

EDIT:
Den Code habe ich auf Wunsch Einzelner (siehe 3ter Post) entfernt.

Olli 22. Jul 2005 19:20

Re: TAboutScroller Fensterklasse [nonVCL]
 
Falls sich jemand wunderte, warum der Beitrag plötzlich keinen Code mehr enthielt und auch kein Attachment: ich hatte erst nach dem Posten bemerkt, daß ich einen Gruß an Melkij drin hatte, den Freund, der am letzten Wochenende verstarb. Das habe ich jetzt korrigiert.

CalganX 22. Jul 2005 19:23

Re: TAboutScroller Fensterklasse [nonVCL]
 
Hi Olliver,
Vorschlag: da du den Code sowieso im Anhang hast. Könntest du in deinem Beitrag nur die Verwendungsweise erklären? Der überlange SourceCode ist ein wenig... naja, störend. ;) Auch wenn man ihn zu klappen kann. ;)

Danke dir,
Chris

PS: Ist nichts gegen dich. Hätte ich zu jedem gesagt, der Source und Anhang hat. ;)

[edit]Ich danke dir! :thumb:[/edit]

turboPASCAL 17. Nov 2005 20:11

Re: TAboutScroller Fensterklasse [nonVCL]
 
[Edit = turboPASCAL] Ich hatte versehentlich hier ein Doppelpost gebaut [Edit]

turboPASCAL 18. Nov 2005 09:53

Re: TAboutScroller Fensterklasse [nonVCL]
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hi, lange ist's her, hier mal ein Beispiel für eine Non-VCL Anwendung.

In der Resource gibt man einfach für ein Control den Classennamen "TAboutScroller" an, das ist alles.

Code:
[color=#005f00]// Inhalt der Resourcedatei Demo.rc[/color]

#define IDD_DLG1 100
#define IDC_BTN1 1001
#define IDC_SCR1 1002
IDD_DLG1 DIALOGEX 6,6,190,102
CAPTION "Demo"
FONT 8,"MS Sans Serif",0,0
STYLE 0x10CE0800
BEGIN
  CONTROL "Close",IDC_BTN1,"Button",0x50010000,125,78,54,15
  CONTROL "",IDC_SCR1,"[color=#ff0000]TAboutScroller[/color]",0x50000000,10,9,168,59
END
Danach mit dem Resourcencompiler die .Res erstellen.

Im Sourcecode der Anwendung kann man nun mit
Delphi-Quellcode:
SendDlgItemMessage(hwnd, IDC_SCR1, WM_ASSASETCOLORS, RGB(0, 0, 255), RGB(0, 0, 0));
die Text- und Hintergrundfarbe setzen.

Der Text für den AboutScroller wird per Sendmessage übergeben.
Delphi-Quellcode:
{var AboutTxt: String}

SetDlgItemText(hwnd, IDC_SCR1, @AboutTxt[1]);

Olli 20. Nov 2005 09:50

Re: TAboutScroller Fensterklasse [nonVCL]
 
Danke Matti! :thumb:

turboPASCAL 20. Nov 2005 09:59

Re: TAboutScroller Fensterklasse [nonVCL]
 
Bitte. :mrgreen:

Habe da gleich mal noch eine Frage, wie müsste ich den (dein) Code ändern damit ich die Textfarbe während dem Scrollen ändern kann ("rotierende Palette"). Ich habe schon ein bissel herum experimentiert aber so recht wolte es nicht funktionieren.

Olli 20. Nov 2005 10:06

Re: TAboutScroller Fensterklasse [nonVCL]
 
Zitat:

Zitat von turboPASCAL
Habe da gleich mal noch eine Frage, wie müsste ich den (dein) Code ändern damit ich die Textfarbe während dem Scrollen ändern kann ("rotierende Palette"). Ich habe schon ein bissel herum experimentiert aber so recht wolte es nicht funktionieren.

Puh, dann müßtest du so ziemlich alles über den Haufen werfen. Mit der GDI ist es nicht so einfach Flackern zu verhindern, weshalb bei mir eine Bitmap im Hintergrund gerendert würd (beim Setzen des Fonts, der Farbe usw.) und dann erst gescrollt wird. Genau diesen Mechanismus müßte man dann so umschreiben, daß er sich die aktuelle Zeile merkt und dann die Farbe wechselt (vorzugsweise über eine neue Fensternachricht).

Oder meinst du gar, daß die einzelenen Pixelzeilen des Textes in unterschiedlichen Farben erscheinen sollen?

turboPASCAL 20. Nov 2005 10:32

Re: TAboutScroller Fensterklasse [nonVCL]
 
Zitat:

Zitat von Olli
Oder meinst du gar, daß die einzelenen Pixelzeilen des Textes in unterschiedlichen Farben erscheinen sollen?

Nein, nur die Textfarbe. Ein Farbverlauf für den Text wäre ja zu Aufwendig.
Ich würde gern dem Text wärend dem Scrollen eine andere Farbe zuweisen. Bei dem InitializeBitmap() nur den Text neu zeichnen ohne die Scrollpos. zu verändern.

(ist aber nicht dringend, nur Experimentell)

turboPASCAL 31. Jan 2006 20:31

Re: TAboutScroller Fensterklasse [nonVCL]
 
Kleines Exe-Demo-Update siehe oben...
---------------------------------------------

So, nun habe ich wieder mal was mit dem AboutScroller zu tun gehabt.
Was mir aufgefallen ist, ist das einige Sachen nicht wieder freigegeben werden.
Delphi-Quellcode:
function ScrollThread(psc: PScrollConfig): DWORD; stdcall;
begin
  // As long as a main window is assigned
  while (psc^.MainWnd <> 0) do
  begin
    // Increment position
    InterlockedIncrement(psc^.Position);
    // Send the change request to the window
    SendMessage(psc^.MainWnd, WM_ASSAREFRESHSCROLL, 0, 0);
    // Sleep until next refresh cycle
    Sleep(psc^.ScrollDuration);
  end;
  // --- nach dem WM_DESTROY kommt er nicht er hier an ---------- //
  // deswegen habe ich die Freigaben ins WM_DESTROY - Ereignis verschoben

  // Make sure no one else will use the pointer
  SetWindowLong(psc^.MainWnd, GWL_USERDATA, Integer(0));
  // And the config struct itself
  GlobalFree(THandle(psc));
  result := Ord(True);
end;
Delphi-Quellcode:
function TAboutScroller_WindowProc...
//...
    WM_DESTROY:
      begin
        // Terminate the scroller thread, friendly method to do this
        // From this value the thread knows it should terminate and free the
        // config struct.

        // Finally free the text buffer          <----<<<
        GlobalFree(THandle(psc^.TextBuffer));
        // Delete GDI objects
        DeleteObject(psc^.Bmp);
        DeleteObject(psc^.BgBrush);           // <----<<<
        // Close Thread Handle
        CloseHandle(psc^.Thread);

        psc^.MainWnd := 0;                    
      end;
Was macht man denn nun mit dem "GlobalFree(THandle(psc));"-Dingens, im WM_DESTROY-Ereigniss bringt es eine AV ? :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:19 Uhr.
Seite 1 von 2  1 2      

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-2025 by Thomas Breitkreuz