Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi StatusBar1.Perform(SB_GETRECT, 1, integer(@r)); WAS ist das? (https://www.delphipraxis.net/71099-statusbar1-perform-sb_getrect-1-integer-%40r-%3B-ist-das.html)

juergen 8. Jun 2006 22:15


StatusBar1.Perform(SB_GETRECT, 1, integer(@r)); WAS ist das?
 
Hallo zusammen,
ich habe hier einen Codeteil gefunden der in einer Statusbar eine Laufschrift zeichnet...(zeichnen soll)

Delphi-Quellcode:
private
  x, i: Integer;
  S: String;
  r: TRect;

{ ... }

uses CommCtrl;

{ ... }

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  [u]StatusBar1.Perform(SB_GETRECT, 1, integer(@r));[/u]

  r.Right := r.Right - 1; //-1 wegen dem rechten Rand
  r.Left := r.Left + 1;   //+1 wegen dem linken Rand

  StatusBar1.Repaint;

  If (x > (StatusBar1.canvas.TextWidth(S) - r.Left) * -1) then
    begin
      i := StatusBar1.Canvas.Font.Size div 2; //Die Hälfte der Schrifthöhe berechnen

      StatusBar1.Canvas.FillRect(r);
      StatusBar1.Canvas.TextRect(r, x, ((r.Bottom - r.Top) div 2) - i, S);
      dec(x);
    end
  else
    x := r.Right - r.Left; //Right - Left = Breite des Feldes
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//  statusbar1.Canvas.Font.Color := clBlue;
  StatusBar1.canvas.Brush.Style := bsclear;
//  statusbar1.Canvas.Font.Size := 12;

  S := 'Es wäre gut, wenn ich das alles verstehen würde! Helft mir bitte dabei...;
end;
Leider verstehe ich von der folgenden Zeile nun überhaupt nichts:
StatusBar1.Perform(SB_GETRECT, 1, integer(@r))

Hier bekomme ich auch eine Fehlermeldung.
Fehlermeldung:
[Fehler] Form1.pas(266): Undefinierter Bezeichner: 'SB_GETRECT'

Meine Fragen wären:
- was ist das SB-GETRECT, wozu dient es und wie muss es deklariert werden
- warum wird @r hier so angewendet, bzw. muss so angewendet werden?

Vielen Dank schon mal vorab!

Luckie 8. Jun 2006 22:28

Re: StatusBar1.Perform(SB_GETRECT, 1, integer(@r)); WAS ist
 
Binde mal die Unit CommCtrl in den Uses ein.

Die Methode Perform kapselt die API Funktion MSDN-Library durchsuchenSendMessage und schickt die nachricht an das Betreffende Steuerelement.

MSDN-Library durchsuchenSB_GETRECT ermittelt die Größe eines Statusbarpanels und schreibt diese in eine Struktur vom Typ Rect. Diese wird als WParam als Zeiger (@r) übergeben, der noch mal nach Integer gecastet wird.

juergen 8. Jun 2006 22:42

Re: StatusBar1.Perform(SB_GETRECT, 1, integer(@r)); WAS ist
 
Vielen Dank für die Erklärungen!
(ich hatte übrigens die CommCtrl vergessen :oops:)

SB_GETRECT versteh ich heute nicht mehr... :roll:
Schau ich mir morgen mal an.

Gute Nacht!

BunnyX 24. Jan 2007 16:55

Re: StatusBar1.Perform(SB_GETRECT, 1, integer(@r)); WAS ist
 
Hi,
bin grade dabei für mein Schulprojekt die Sache mit der Laufschrift auszuprobieren. Aber was ist eine "CommCtrl" und wie muss man die einbinden?
Danke schon mal im Vorraus

DGL-luke 24. Jan 2007 16:58

Re: StatusBar1.Perform(SB_GETRECT, 1, integer(@r)); WAS ist
 
"CommCtrl.pas" ist eine Delphi-Unit, die die "COmmon COntrols" der WinAPI mappt und über die VCL zur Verfügung stellt.

Jede Delphi-Unit hat eine "uses-Klausel", das sieht z.B. so aus:

Delphi-Quellcode:
unit Unit1.pas

interface

uses
  Windows, Classes, Sysutils;

...
Da musst du jetzt "CommCtrl" dazuschreiben.

BunnyX 24. Jan 2007 17:02

Re: StatusBar1.Perform(SB_GETRECT, 1, integer(@r)); WAS ist
 
Danke für deine Antwort!
Aber das Funktioniert auch nicht! Da erscheint dann die Fehlermeldung: "Dekleration erwartet, aber "CommCtrl" gefunden.

DGL-luke 24. Jan 2007 17:05

Re: StatusBar1.Perform(SB_GETRECT, 1, integer(@r)); WAS ist
 
Delphi-Quellcode:
unit Unit1.pas

interface

uses
  Windows, Classes, Sysutils, CommCtrl;

...
Wenn du es so machst?! Windows, CLasses, SysUtils sind natürlcih nur Beispiele.

BunnyX 24. Jan 2007 17:08

Re: StatusBar1.Perform(SB_GETRECT, 1, integer(@r)); WAS ist
 
Okay, habe mein Fehler gefunden. Habe mal wieder Semikolon mit Komma vertauscht :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:50 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-2025 by Thomas Breitkreuz