Panel-Array zur Laufzeit erstellen + auf Event reagieren?
-
Braunstein schrieb:
Setze beim OnMouseDown-Event eine bool-Variable auf true, so dass du im OnMouseMove weißt, dass die linke Teats gedrückt ist. Bei OnMouseUp setzt du diese Variable wieder zurück.
Hab ich schon probiert, funktioniert aber nicht, schätze dass er solange ich die linke Maustate gedrückt halte nicht mehr aus der OnMouseDown Event-Routine rauskommt. Kann das sein?
-
Nein, das kann nicht sein. Wie hast du es denn probiert?
-
Braunstein schrieb:
Nein, das kann nicht sein. Wie hast du es denn probiert?
Eigentlich wie Du gesagt hast. Ich habe für das eine Dummy-Panel auch noch die beiden Events "OnMouseDown" und "OnMouseUp" hinzugefügt und darin setze ich eine globale Variable auf einen bestimmten wert, welchen ich dann in der "OnMouseMove"-Routine abfrage und dementsprechend bei mouse down reagiere, und ansonsten nicht. Dabei tut sich nichts.
-
Setze mal Breakpoints in alle 3 Events und schau nach ob die angesprungen werden. Deine bool Variable sollte nicht global sonder besser ein member deiner Form sein (private). Außerdem solltest du sie im Konstruktor der Form initialisieren.
-
Braunstein schrieb:
Setze mal Breakpoints in alle 3 Events und schau nach ob die angesprungen werden. Deine bool Variable sollte nicht global sonder besser ein member deiner Form sein (private). Außerdem solltest du sie im Konstruktor der Form initialisieren.
Hab ich gemacht. Die OnMouseDown bzw. Up Events werden nie angesprungen. Sobald ich mit der Maus über eines der Panels fahre springt er in das OnMouseMove-Event hinein. Ich komme gar nicht zum Klicken.
Was ich aber hinbekommen habe ist, dass ich bei OnMouseKlick eine BoolVariable invertiere, also beim 1. Klick fängts an zu Zeichnen, beim 2. Klick hörts wieder auf. Würde das jedoch gerne so hinbekommen, dass er nur während die Maustaste gedrückt gehalten wird auch wirklich reagiert.
-
Sind die MouseDown und Up-Events auch ordentlich zugewiesen? D.h. hast du die mit dem Objektinspektor erstellt?
Bei mir funktioniert das einwandfrei.
-
Braunstein schrieb:
Sind die MouseDown und Up-Events auch ordentlich zugewiesen? D.h. hast du die mit dem Objektinspektor erstellt?
Bei mir funktioniert das einwandfrei.Jep, die habe ich mit dem Objektinspektor erstellt und weise sie in der verschachtelten Schleife den Panels folgendermaßen zu:
panel[i][j]->OnMouseDown = Panel1MouseDown
Es reagiert jeweils nur das einzige Panel, über dem ich gerade Klicke. Egal über wie viele andere ich auch noch drüber fahre, passiert nichts mehr, bis ich loslasse und wieder klicke, dann reagiert wieder ein Panel.
Habe nun nochmals rumprobiert und dabei gemerkt, dass das ganze funktioniert! Jedoch mit der rechten Maustaste, nicht mit der Linken. Wie kann ich das nun wieder ändern?
Ich habe innerhalb des OnMouseMove-Events eine testweise Ausgabe integriert und kann nun deutlich sehen, in die Routine springt er sowohl bei rechten als auch bei linkem Klick der Maustaste hinein. Jedoch zeichnen tut er nur beim Drücken der rechten Taste. Verstehe das nicht!
-
Ohne deinen Code zu kennen kann ich da keine weiteren Hinweise geben.
-
Braunstein schrieb:
Ohne deinen Code zu kennen kann ich da keine weiteren Hinweise geben.
Oki hier einige Codeschnipsel:
Im Konstruktor generiere ich die Panels:
for (int i = 0; i < iZeilen; i++) { for (int j = 0; j < iSpalten; j++) //Panels auf Oberflaeche erzeugen { pan[i][j] = new TPanel(this); pan[i][j]->Top = i*iHoehe+55; pan[i][j]->Left = j*iBreite+20; pan[i][j]->Height = iHoehe; pan[i][j]->Width = iBreite; pan[i][j]->Parent = this; pan[i][j]->Color = clScrollBar; pan[i][j]->Caption = ""; pan[i][j]->Tag = tag; pan[i][j]->OnMouseMove = Panel1MouseMove; pan[i][j]->OnClick = Panel1Click; pan[i][j]->OnMouseDown = Panel1MouseDown; pan[i][j]->OnMouseUp = Panel1MouseUp; tag++; }//end for }//End for
Events für Panel1 (Dummy-Panel): void __fastcall TForm1::Panel1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { maus = 1; } //--------------------------------------------------------------------------- void __fastcall TForm1::Panel1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { maus = 0; }
maus = Integer. 0 = nicht gedrückt, 1 = maustaste gedrückt.
Event OnMouseMove:
void __fastcall TForm1::Panel1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { AnsiString str, str2; int zeile, spalte; //static int tmp; //test TPanel *panelint = ((TPanel *)(Sender)); int zs = panelint->Tag; //Label5->Caption = maus; //Test if (maus) { //tmp++; //Test //Label7->Caption = tmp; //Test zeile = giveMeI(zs); spalte = giveMeJ(zs, zeile); if (!modus) { pan[zeile][spalte]->Color = farbe; iFeld[zeile][spalte] = 1; }//end if if (modus) { pan[zeile][spalte]->Color = clScrollBar; iFeld[zeile][spalte] = 0; }//end if str = (AnsiString) spalte; str2 = (AnsiString) zeile; Label11->Caption = str; Label13->Caption = str2; }//end if }//End panel1 mouse move
Wie gesagt, bei rechter Maustaste funktionierts, nur bei linker Maustaste reagiert nur 1 einziges Panel.
-
Also ich belasse es einfach dabei, dass man mit der rechten Maustaste zeichnen muss. Danke für eure Hilfe!
Thread kann geschlossen werden...