StatusBar->Panels - eigene Objekte? [gelöst]
-
Du kannst Style der entsprechenden Panels auf psOwnerDraw setzen und im Event OnDrawPanel der Statusbar selbst zeichnen was du willst.
-
Vielen Dank,
eure Antworten bringen mich schonmal ein Stück weiter. Style auf psOwnerDraw setzen habe ich auch gerade in der Hilfe gelesen, muss ich nur noch herausbekommen wie "selbst zeichnen" vonstatten geht... Ich werde das Ergebnis posten. Bis dahin tauchen hier bestimmt noch Fragen von mir auf!

-
Mittels den Eigenschaften und Methoden von TStatusBar::Canvas kannst du beliebige Objekte (Rechtecke, Kreise, Linien, Punkte, Texte etc.) zeichnen.
-
Auf TStatusBar::Canvas wäre ich nie gekommen - in der Hilfe steht, es ist ReadOnly

Ich experimentiere gerade damit herum...
-
Du beschreibst auch nicht StatusBar->Canvas sondern liest die Adresse und benutzt Methoden des Objekts. ->Grundlagen OOP?
-
Morris Szyslak schrieb:
->Grundlagen OOP?
Sind bei mir lückenhaft, das gebe ich ohne schlechtes Gewissen zu, jeder fängt mal an...
Morris Szyslak schrieb:
Du beschreibst auch nicht StatusBar->Canvas sondern liest die Adresse und benutzt Methoden des Objekts.
Ist soweit recht klar gewesen, wozu sollte sonst der Zeiger sein!? Ich meinte: Auf die Idee es so zu machen wäre ich nie gekommen. Sowas habe ich (bewußt) noch nicht gemacht. Ich hab schon ein Objekt in einen Zeiger gecastet und über den Zeiger die Eigenschaften des Objekts verändert (ich hoffe das ist korrekt ausgedrückt), das ist zwar sowas in die Richtung aber eben nicht dasselbe...
Kommen wir zur Anschlussfrage: Ich habe jetzt Zwei von 5 Panels auf psOwnerDraw gesetzt und sie in DrawPanel nach meinen Vorstellungen gestaltet. Nun will ich auch ein drittes Panel gestalten, jedoch anders als die zwei Vorherigen. Wie kann ich da eine Unterscheidung vornehmen?
-
Hallo
Der Event hat den Parameter Panel, der das betroffene Panel angibt. Du kannst also zum Beispiel anhang von Panel->Index eine Auswahl machen.
bis bald
akari
-
Beispielsweise über Panel->ID oder Index. Hilfe lesen bringt's.
-
akari schrieb:
Der Event hat den Parameter Panel, der das betroffene Panel angibt. Du kannst also zum Beispiel anhang von Panel->Index eine Auswahl machen.
Danke für den Tipp!
Morris Szyslak schrieb:
Beispielsweise über Panel->ID oder Index. Hilfe lesen bringt's.
Auch an dich Danke. Ich lese übrigens viel in der Hilfe, benutze die Forumsuche und eine bekannte Suchmaschine. Mit fehlender Erfahrung werden manchmal leider daraus bestimmt Zusammenhänge nicht klar. Auch muss man um Ideen zu haben schon die Möglichkeiten im Kopf haben, was bei mir oft noch nicht der Fall ist. Erschwerend kommt hinzu, dass man (ich) auch noch oft Hinweise übersieht, wie zB. dass die Eventfunktion ja schon "StatusBarDrawPanel" heißt. Zusätzlich habe ich einfach nicht die Zeit Alles im Detail zu erforschen (mache ich trotzdem oft) und frage deswegen manchmal lieber schnell nach. Wenn dich meine Unwissenheit nervt, dann antworte doch einfach nicht - oder habe ich dich falsch interpretiert ("Hilfe lesen bringt's.")?
-
Und da bin ich schon wieder (ganz mutig) bei der nächsten Frage zum Thema: Ich kann nun durch die Nutzung der StatusBar::Canvas-Methoden / -Eigenschaften das Aussehen der Panels selbst bestimmen und unterschiedliche Panels unterschiedlich gestalten. Nun müsste ich zur Laufzeit ein TDrawPanelEvent(?) auslösen, damit ich während der Laufzeit die Panels verändern kann.
1. Wie löse ich so ein Event aus? Wie muss die Syntax aussehen?
(1. b - soll ich einen neuen Thread dazu aufmachen?)Und eine Frage noch zu den vorangegangenen Dingen:
2. Die ZeileTCanvas *pCanvas= StatusBar->Canvas;bedeutet: ich erstelle einen Zeiger des Typs TCanvas, der auf die Eigenschaft Canvas meiner StatusBar zeigt. Dadurch kann ich die Eigenschaften von StatusBar->Canvas indirekt verändern. Direkt geht es nicht, weil StatusBar::Canvas ReadOnly ist. Richtig?
-
Hallo
1. Ruf einfach die Methode Update() für die StatusBar auf
2. Nein du kannst auch direkt über die Eigenschaft Canvas arbeiten. Das const bedeutet nur das du der Eigenschaft selber keine neue Adresse zuweisen kannst.bis bald
akari
-
akari schrieb:
Kolumbus schrieb:
1. Wie löse ich so ein Event aus?
1. Ruf einfach die Methode Update() für die StatusBar auf
Hilfe schrieb:
Die Methode Update verarbeitet umgehend alle anstehenden Botschaften, die mit dem Zeichnen des Objekts zu tun haben.
virtual void __fastcall Update(void);
Beschreibung
Mit Update kann das Steuerelement vor zeitaufwendigen Operationen neu gezeichnet werden. Die Methode erlaubt eine sofortige Rückmeldung an den Benutzer, ohne daß dieser auf die entsprechende Windows-Botschaft zu warten braucht. Update veranlaßt einfach ein erneutes Zeichnen aller Bereiche, die bereits invalidiert wurden. Soll auch das Steuerelement invalidiert werden, verwenden Sie statt dessen Repaint.
Update ruft die Windows-API-Funktion UpdateWindow auf. Diese verarbeitet alle anstehenden Botschaften, die mit dem Zeichnen des Objekts zu tun haben. Weitere Informationen hierzu finden Sie in der Hilfedatei WIN32.HLP (Win32 Developer’s Reference).Fragen dazu:
* Es stehen doch gar keine Botschaften an, die verarbeitet werden können?
* Den 2. Satz der Beschreibung verstehe ich komplett nicht. Was für eine Rückmeldung? Was für eine Windows-Botschaft?
* Was heißt invalidiert? Hat das was mit amputieren zu tun - bzw. Invalide? (Sry, versuche nur das Ganze mit Humor zu nehmen)akari schrieb:
2. Nein du kannst auch direkt über die Eigenschaft Canvas arbeiten. Das const bedeutet nur das du der Eigenschaft selber keine neue Adresse zuweisen kannst.
Mit const meinst du ReadOnly? Sprich: ReadOnly== const? Wie muss die Syntax aussehen, um direkt über Canvas zu arbeiten? Ich hab das jetzt gemacht, wie im Hilfe-Beispiel beschrieben:
void __fastcall TFormXYZ::StatusBar1DrawPanel( TStatusBar *StatusBar, TStatusPanel *Panel, const TRect &Rect) { TCanvas *pCanvas= StatusBar->Canvas; if((Panel->Index==1) || (Panel->Index==3)) { pCanvas->Brush->Color= clRed; pCanvas->FillRect(Rect); pCanvas->TextOut(Rect.Left + 15, Rect.Top + 1, "inaktiv"); } } //---------------------------------------------------------------------------
-
StatusBar1->Canvas->Brush->Color= clLime; StatusBar1->Update();das habe ich jetzt in ein ButtonClick eingebaut. Leider passiert nach dem Drücken des Buttons garnichts. Warum muss das Alles so kompliziert sein?
-
void __fastcall TFormXYZ::StatusBar1DrawPanel( TStatusBar *StatusBar, TStatusPanel *Panel, const TRect &Rect) { TCanvas *pCanvas= StatusBar->Canvas; switch(Panel->Index) { case 1: if(Status1) { pCanvas->Brush->Color= clLime; pCanvas->FillRect(Rect); pCanvas->TextOut(Rect.Left + 18, Rect.Top + 1, "aktiv"); } else { pCanvas->Brush->Color= clRed; pCanvas->FillRect(Rect); pCanvas->TextOut(Rect.Left + 15, Rect.Top + 1, "inaktiv"); }break; case 3: if(Status2) { pCanvas->Brush->Color= clLime; pCanvas->FillRect(Rect); pCanvas->TextOut(Rect.Left + 18, Rect.Top + 1, "aktiv"); } else { pCanvas->Brush->Color= clRed; pCanvas->FillRect(Rect); pCanvas->TextOut(Rect.Left + 15, Rect.Top + 1, "inaktiv"); }break; } } //---------------------------------------------------------------------------So, jetzt werden die entsprechenden Panels in der Statusleiste farblich und textlich verändert, wenn an geeigneter Stelle
StatusBar1->Update();aufgerufen wird. Ohne zu wissen, was Update() eigentlich macht. Naja, zumindest weiß ich jetzt, dass Update() das DrawPanel-Ereignis auslöst... Ist ja schonmal ein Anfang!

Jetzt gehts ans Linie zeichen über alle Panels!
-
Alles Betrug! Man kann zwar die Eigenschaft Bevel der StatusBar-Panels auf pbNone setzen, die Rahmen bleiben jedoch erhalten. Die Rahmenlinien werden nur mit derselben Farbe gezeichnet, wie die Hauptfläche der Panels. Will ich jetzt eine Linie von Koordinaten(x,y)= (1,1) bis (50,1) zeichnen, geht die Linie nur bis ca. (47,1) und dann ist eine Lücke bis zum nächsten Panel. Wegen des Rahmens, der anscheinend nicht überzeichnet wird... Auch ist die Linie nicht ganz oben auf dem Panel. Aus der Traum von einer durchgehenden Trennlinie zum restlichen Client-Bereich des Forms!

Kann man da irgendwie tricksen, ohne eine neue/abgeleitete Klasse zu schreiben?
-
Die Linie auf der Form statt auf der StatusBar zeichnen!?
-
Ja, hab' ich auch schon dran gedacht, will ich aber nicht. Trotzdem Danke für die Antwort. Hab jetzt einfach alle Tafeln "tiefergelegt". Das muss als Abgrenzung reichen!