Wohin mit dem Code
-
Hallo,
ich bin dabei mir ein OCX zu erstellen. Wo muss ich folgenden Code:
TRect rect; rect=GetClientRect(); //Edit1->Text = rect.top; Canvas->Pen->Color = RGB(0,0,0); Canvas->Pen->Width = 2; Canvas->MoveTo( rect.left+20,rect.top+20); Canvas->LineTo( rect.left+20,rect.bottom-20); Canvas->LineTo( rect.right-20,rect.bottom-20);
hinschreiben, dass die Linien bereits zur Initialisierung sichtbar werden. Im Moment hab ich den Code hinter einem Button und da funktioniert es. Ich will aber, das das ohne ButtonClick gezeichnet wird.
Danke für jeden Tip.
-
Ich würd das jetzt spontan ins OnPaint-Ereigniss schreiben, da hier ja auch die Form gezeichnet wird. evtl geht das auch im FormShow (bin mir aber nicht sicher)??
-
warum nicht in den konstruktor .. ?
-
DAS wäre natürlich auch ne lösung
-
Ja die beiden Möglichkeiten hab ich schon versucht, aber das funzt nicht, was hab ich da falsch gemacht?
Vielleicht ist es wichtig zu wissen, ich habe eine neue Anwendung über den Assistenten " ActiveX Form" angelegt, aber irgendwie haut das nicht hin.
-
Nimm nen Timer, stell ihn auf 1 ms und lösche den Timer in seiner eigenen Funktion, sodass er nur einmal aufgerufen wird:
void TForm1::Timer1Timer(TObject* Sender) { TRect rect; rect=GetClientRect(); //Edit1->Text = rect.top; Canvas->Pen->Color = RGB(0,0,0); Canvas->Pen->Width = 2; Canvas->MoveTo( rect.left+20,rect.top+20); Canvas->LineTo( rect.left+20,rect.bottom-20); Canvas->LineTo( rect.right-20,rect.bottom-20); delete Timer1; }
-
Windoof schrieb:
Nimm nen Timer, stell ihn auf 1 ms und lösche den Timer in seiner eigenen Funktion, sodass er nur einmal aufgerufen wird:
Brutale (und wahrscheinlich auch bedenkliche) Methode. Also, wenn man
einen Timer verwenden will, um ihn ein einziges Mal aufzurufen (Sinn?),
dann würde ich anstatt das Objekt mit delete zu löschen einfach den Timer
deaktivieren:Timer1->Enabled = false;
Gruß,
Alexander
-
Also bei mir (BCB6) funktioniert es weder im Konstruktor noch im FormCreate, ABER es klappt im OnPaint
Da zeichnet er mir 2 linien.
-
Hallo,
ich arbeite mit dem BCB5 und da hat es bis jetzt nicht in der OnPaint funktioniert, aber ich werd es nochmal versuchen.
Das mit dem Timer find ich persönlich nich wircklich eine gute Idee.
Danke trotzdem.
-
nimm nen Timage als grundlage für den kanvas dann funktioniert das zeichnen beim starten (im konstruktor) ... in ner paintbos funktioniert das nicht .. hatte das selbe problem
-
Hallo,
da ich noch ich solange mit dem BCB arbeitet, wäre es schön, wenn du mir das mal ein bißchen genauer beschreiben kannst. Ich weiß nich genau was du meinst, wie ich das mit dem TImage machen soll. Ich möchte, das die Linien gleich auf der Form gezeichnet werden.
-
hallo,
also da sind wir uns einig, das mit dem timer ist wohl nicht die lösung. eine timage kompo kann ihren inhalt selber neu zeichnen, es muss also nicht für das neuzeichnen gesorgt werden wie dies etwa beim form-canvas bzw. einer paint-box der fall ist.
platzier doch einfach eine timage, geb ihr Align=alClient und schreib in das OnShow des form:
void __fastcall TForm1::FormShow(TObject *Sender) { TRect rect; rect=GetClientRect(); //Edit1->Text = rect.top; Image1->Canvas->Pen->Color = RGB(0,0,0); Image1->Canvas->Pen->Width = 2; Image1->Canvas->MoveTo( rect.left+20,rect.top+20); Image1->Canvas->LineTo( rect.left+20,rect.bottom-20); Image1->Canvas->LineTo( rect.right-20,rect.bottom-20); }
also einfach nur noch das image qualifizieren und schon übernimmt das image das zeichnen anstatt dass man hierzu form-paint bemühen muss. musst vielleicht noch transparent= true setzen wenn du keinen hintergrund haben willst....
mfg
murph
-
Hallo,
ich bin glaub ich zu doof. Ich hab den Assistenten benutzt und eine ActiveX Form angelegt. Da find ich aber die OnShow nich. Könnt ihr mir da bitte nochmal helfen.
Danke
-
hola
OnShow ist im Objektinspektor nicht drinnen (zu midest bei mir auch net).
aber unter (wenn deine Form "Form" heisst) Form-> gibt es das OnShow.Meep Meep
-
Genau das mein ich ,bei ner normalen Form is es da aber bei der AxtiveX Form nich
-
doch bei ActiveFormX is es auch dabei. nur halt nich im objektinspektor.
schreibmal ActiveFormX->OnShow. da siehst es dann
Meep Meep
-
Und wohin soll ich das schreiben?
-
du brauchst jetzt ne eigene funktion:
void __fastcall FormShow(TObject *Sender); // im public // dann im konstruktor z.b: ActiveFormX = &FormShow;
hoffe das das so jetzt stimmt.
Meep Meep
-
Wenn ich das so versuche, mekert er immer rum, das eine Mehrdeutigkeit besteht.
Kannst du mir das bitte nochmal genau sagen wie du das gemacht hast?
-
// ActiveFormImpl1.h class TActiveFormX : public TActiveForm { __published: // Von der IDE verwaltete Komponenten private: // Anwender-Deklarationen public: // Anwender-Deklarationen __fastcall TActiveFormX(HWND ParentWindow); __fastcall TActiveFormX(TComponent* AOwner): TActiveForm(AOwner) {}; void __fastcall tempo(TObject *z); }; //--------------------------------------------------------------------------- extern PACKAGE TActiveFormX *ActiveFormX; // ActiveFormImpl1.cpp TActiveFormX *ActiveFormX; //--------------------------------------------------------------------------- __fastcall TActiveFormX::TActiveFormX(HWND ParentWindow) : TActiveForm(ParentWindow) { this->OnShow = &tempo; } //--------------------------------------------------------------------------- void __fastcall TActiveFormX::tempo(TObject *z) { // test }
Meep Meep