AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte TAboutScroller Fensterklasse [nonVCL]
Thema durchsuchen
Ansicht
Themen-Optionen

TAboutScroller Fensterklasse [nonVCL]

Ein Thema von Olli · begonnen am 22. Jul 2005 · letzter Beitrag vom 14. Apr 2007
Antwort Antwort
Seite 1 von 2  1 2      
Olli
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 - 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.
Angehängte Dateien
Dateityp: rar assascontrols_359.rar (6,8 KB, 69x aufgerufen)
 
Olli
 
#2
  Alt 22. Jul 2005, 19:20
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.
  Mit Zitat antworten Zitat
CalganX

 
Turbo Delphi für Win32
 
#3
  Alt 22. Jul 2005, 19:23
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! [/edit]
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

 
Delphi 6 Personal
 
#4
  Alt 17. Nov 2005, 20:11
[Edit = turboPASCAL] Ich hatte versehentlich hier ein Doppelpost gebaut [Edit]
Matti
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

 
Delphi 6 Personal
 
#5
  Alt 18. Nov 2005, 09:53
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
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]);
Angehängte Dateien
Dateityp: exe xmplayer_299.exe (61,0 KB, 84x aufgerufen)
Dateityp: zip aboutscrollerdemo_401.zip (18,2 KB, 60x aufgerufen)
Matti
  Mit Zitat antworten Zitat
Olli
 
#6
  Alt 20. Nov 2005, 09:50
Danke Matti!
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

 
Delphi 6 Personal
 
#7
  Alt 20. Nov 2005, 09:59
Bitte.

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.
Matti
  Mit Zitat antworten Zitat
Olli
 
#8
  Alt 20. Nov 2005, 10:06
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?
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

 
Delphi 6 Personal
 
#9
  Alt 20. Nov 2005, 10:32
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)
Matti
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

 
Delphi 6 Personal
 
#10
  Alt 31. Jan 2006, 20:31
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 ?
Matti
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 01:32 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