Event OnPaint bei TMemo
-
Das Neuzeichnen durch Windows funktioniert auch einwandfrei, mein Problem ist ein anderes.
Ich kann zur Laufzeit meines Programmes beliebig viele Memos erzeugen und auf auch mit der Maus verschieben. Dadurch erhalte ich einen sehr großen Haufen von Notizzetteln.
Um nun zu erkennen welcher den Focus hat möchte ich hervorheben, also einen Rahmen zeichnen. Für OnEnter und OnExit funktioniert das Ganze auch, aber wenn neu gezeichnet werden soll eben nicht (dann ist der Rahmen wieder weg).
-
Hast du vielleicht einen Brush->Style oder Pen->Style gewählt, der sich beim 2. Aufruf wieder löscht? Das kann man machen, wenn es aus irgendwelchen gründen sinnvoll ist. Aber um sichtbar zu sein, muß dann immer eine ungerade Zahl an Auslösungen erfolgen. Durch einen doppelten Aufrufeintag kannst du prüfen, ob hier der Fehler liegt. Mit bsSolid hast du solche Probs erst gar nicht. - Das wär zumindest mal eine Möglichkeit. Ohne näheres zu wissen, ist da schlecht was zu sagen.
-
Mein Problem ist, daß ich mich nicht in den OnPaint-Event hängen kann, weil ich nicht weiß wie das geht.
-
WM_PAINT abfangen. Zum Abfangen von Windows-Messages steht was in den FAQ.
-
mit
void __fastcall PaintMessage(TMessage &Msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_PAINT, TMessage, PaintMessage)
END_MESSAGE_MAP(TMBox)void __fastcall TMBox::PaintMessage(TMessage &Msg)
{
int i;
i++;
}und einem Breakpoint auf i++; stürzt das Programm mit
Im Projekt MMemo.exe ist eine Exception der Klasse
ESTAckOverflow aufgetreten. Meldung: 'Stack-Überlauf.
Prozeß wurde angehalten. Mit Einzelne Anweisung oder
Start fortsetzenab, ohne an dem Breakpoint anzukommen
-
WM_PAINT wird in der Aufbauphase sicher sehr oft aufgerufen. <edit>Das vergeht wieder.
i zählt aber bei jedem Ereignis hoch. Warum willst du das austesten?
Ich meinte TForm, FormShow, FormResize, FormActivate. Das gehört in den Code der App, IMHO nicht in den Code der Komponente. Wenn du einen besonderen Weg für das Neuzeichnen implementiert hast, müßtest du ihn public machen. Anders kann ich mir das nur für ein ActiveX vorstellen, wenn es selbst für sich sorgen soll. Aber rechtfertigt ein Memo den Aufwand? - Oder versteh ich die Situation vollkommen falsch?
-
i++; sollte nicht überlaufen, da ich ja dort eine Breakpoint habe, um zu sehen, daß WM_PAINT richtig verlinkt ist.
Solange meine Routine nicht im richtigen Moment aufgerufen wird, brauche ich mich um deren Inhalt noch nicht kümmern.snoopy_kmo
-
Ich hab jetzt zwar hier nicht alles durchgelesen, nur Deine Frage am Anfang, aber warum legst Du nicht z.B. ein TShape "unter" das TMemo, die Ränder leicht über das TMemo überstehend und steuerst die Farbe von TShape::Brush im TMemo::OnEnter bzw. TMemo::OnExit ?
-
Danke,
das hört sich nicht schlecht an, das werde ich versuchenDanke
snoopy_kmo
-
Das Problem bleibt grundsätzlich das gleiche.
Da ich mehrere Memo übereinanderliegen habe müßte ich das Shape des obersten Memo vor diesem zeichnen, da ich aber nicht weiß, wann dieses gezeichnet wird, sind alle Shapes unterhalb aller Memos, also nicht zu sehen.Ich habe keinen Dunst, wie ich das Problem lösen soll.
Bin für jede Hilfe dankbar.snoopy_kmo
-
Original erstellt von snoopy_kmo:
mehrere Memo übereinanderliegen habeDa gibt es bestimmt eine bessere Lösung, wozu brauchst du denn die die ganzen Memos?
-
von 3M gibt es ein Post-It-Programm welches ich aus vielerlei Gründen anders aufgebaut habe. Einordnen von Memos in Kategorien (mehrere Kategorien pro Memo), beliebige Abfragealgorithmen zum umschalten von visible/unvisible über Kategorien und Datum.
Für mich perönlich echt brauchbar.snoopy_kmo
-
Hmm, grundsätzlich muß ich Jansen erst mal zustimmen. Hab zwar keinen Überblick wie Dein Programm aussieht, aber es gibt bestimmt ne andere Lösung. Man darf nur nicht voreilig vor vielleicht etwas mehr Programmieraufwand zurück schrecken
-
Zeigst du denn auch mehrere Memos gleichzeitig, nur teilweise verdeckt an, oder immer nur eines? Denn in letzterem Fall wäre deine Vorgehensweise eine ziemliche Ressourcenverschwendung und ganz schlechter Programmierstil.
-
Es sieht aus wie bei mir auf dem Schreibtisch, alle gleichzeitig übereinander, aber ich kann innerhalb des Haufens kleinere Haufen selektieren (der Rest wird dann unvisible) und damit eine bessere Übersicht gewinnen.
snoopy_kmo
-
Das hört sich nach Karteikasten an. Allerdings haben die Standard-TabControl bei der Menge IMHO einen großen Nachteil: Man benötigt mehrere Reihen, und immer, wenn man in einer auswählt, gelangt diese Reihe nach unten. Das ist, als würde man bei jedem Suchen den Karteikasten durcheinander feuern. Wirkt auf mich *besoffen*, ich verlier regelmäßig die Orientierung.
Du könntest zB. BitButton (wegen dem Fokusrahmen) auf ein Panel ablegen. Zu jedem Button gehört ein Memo. Nur eins oder ein Satz ist aktiv, der Rest ist unsichtbar.
Nun hättest du selbst im vollen Screen-Client keine Übersichtsprobleme mehr. Du weißt genau, bei welchem Ereignis welches Memo gezeigt wird.
Damit hast du auch ein klar definierbares Ereignis: Das OnClick des dazugehörigen Buttons.
Deine NeuzeichenFunktion sollte einen aussagekräftigen Namen haben. Mach ihn public. Jetzt rufst du in OnClick des Button zB. auf
MyMemo->Show();
MyMemo->MyNewPaint();
Oder je nachdem, wie die Funktion aufzurufen ist.Alternativ könntest du auch bei passender Situation nur ein Memo benutzen und den Inhalt je nach Aufruf wchseln. Du hättest dann nur die Speicherbelegungen für Momo->Text.
So in etwa würde ich mir den Aufbau zumindest in etwa vorstellen. Vielleicht paßt es aber doch nicht zur Situation?
-
hi,
ist kein wirklicher Karteikasten auch kein TabControl.
Angezeigt werden alle Memos auf einem Panel, man kann für jedes Memo beliebige Kategorien und ein Wiedervorlagedatum angeben und dann nach der Kompination von Kategorien und Datum die Sichtbarkeit der Memos steuern. Überlappen sich dann noch Memos kann mit diese mit der Maus verschieben.
Also weder die Anzahl noch die Position der Memos ist festgelegt und damit halte ich eine Anzeige welches Memo den Fokus hat direkt am Memo für die sinnvollste.Aber ich glaube es weiß keiner so richtig, wie ich an das Paint-Ereignis des Memos komme. Oder täusche ich mich da?
snoopy_kmo
-
Also ich würde die Methode mit nem TShape (oder evtl. ein entspr. TPanel), um ein TMemo als "gefucused" zu kennzeichnen, doch nochmal aufgreifen. Du brauchst ja nicht um jedes TMemo so ein Teil legen. Um mal bei TShape zu bleiben, bereite EIN TShape mit der entspr. Farbe vor und setze es invisible. Sobald ein TMemo den Focus erhält (OnEnter) passe das TShape in der Größe und Position an und setze es visible. Verliert das TMemo den Focus (OnExit), setze das TShape wieder invisible ...
-
hi,
ich hab das mal probiert.
Wie gesagt können die Memos wild aufeinander liegen.
TShape, TPanel und TPaintBox werden aber unter allen Memos gezeichnet.
Das heißt wenn ein aktives kleines Memo auf einem größeren zu liegen kommt wird das TShape,TPanel bzw. TPaintBox von dem darunterliegenden großen Memo verdeckt.snoopy_kmo
-
Wie wär's z.B. wenn du das aktive Memo in einer anderen Farbe darstellst?