programm problem mit code
-
Alexander Kempf schrieb:
gerd01 schrieb:
anderen vorschlag?
Was ist das Gegenteil von ein neues Objekt anlegen?
gerd01 schrieb:
nein, leider geht das bei mir nicht, deshalb der umweg über ein neues objekt!
Glaube ich nicht.
Gruß,
Alexander
nagut, es geht wohl doch, war zu voreilig, nur weil er die programmierhilfe nicht geöffnet hat, ging ich davon aus, es wäre nicht möglich, sorry.
aber immer noch speicherfehler, da das my drin bleibt.
zusatz:
aber testet ihr es auch selber mal, vielleicht ist es ja ein allgemeines problem?
gruß gerd
-
gerd01 schrieb:
aber immer noch speicherfehler, da das my drin bleibt.
Dann nimm's halt raus.
Gruß,
Alexander
-
und wie soll ich das umschreiben:
ListBox2->Items->Clear(); Caption=ListBox1->Items->Strings[ListBox1->ItemIndex] ; TControl *my = new TControl(Application); my = FindChildControl(ListBox1->Items->Strings[ListBox1->ItemIndex]); ListBox2->Items->Add(my->Name); Shape1->Left = my->Left - 5; Shape1->Top = my->Top - 5; Shape1->Width = my->Width + 10; Shape1->Height = my->Height + 10; Shape1->Visible = true;es ist ja auch nur eine vermutung, dass es jetzt vielleicht doch daran liegt!
gruß gerd
-
gerd01 schrieb:
und wie soll ich das umschreiben:
Du willst doch ein bestehendes Control finden? Warum erstellst Du denn dann zunächst eines?
Schreib doch anstatt:TControl *my = new TControl(Application); my = FindChildControl(ListBox1->Items->Strings[ListBox1->ItemIndex]);einfach:
TControl *my = FindChildControl(ListBox1->Items->Strings[ListBox1->ItemIndex]);und lösche my dann auf keinen Fall, sonst löschst Du das gefunden Control und das wäre doch schade.
gerd01 schrieb:
es ist ja auch nur eine vermutung, dass es jetzt vielleicht doch daran liegt!
Dann solltest Du Dir Gewissheit verschaffen.
Gruß,
Alexander
Edit: Du solltest natürlich überprüfen, ob FindChildControl auch was vernünftiges zurückgibt.
-
oha, natürlich, einach den zeiger kopieren!

danke für den atritt
ok, speicherproblem bleibt bestehen, hängt jetzt aber mit grünem pfeil in dieser zeile:
ListBox2->Items->Add(my->Name);jetzt irgendwelche ideen?
gruß gerd
-
Vielleicht ist FindChildControl() nicht das richtige. Versuch's mal mit FindComponent() und (wie vorher im Edit gesagt)
prüfe, ob Du auch einen Wert zurückbekommst. Das könntest Du aber auch im Debugger sehen.Gruß,
Alexander
-
danke, werde es probieren.
zumindest bekomme ich mit findchildcontrol bei den labels nichts zurück!
gruß gerd
-
aber da bekomme ich nicht die positionen heraus, da left und sowas erst ab TControl enthalten sind!
gruß gerd
-
so, habe mal nen neues projekt gestartet, und siehe da, speicherfehler treten nur noch bei den labels auf, da bekomme ich irgendwie keine daten zurück über die findchildcontrol() funktion.
ansonsten läuft es rund
gruß gerd
-
gerd01 schrieb:
aber da bekomme ich nicht die positionen heraus, da left und sowas erst ab TControl enthalten sind!
TControl* ctrl = dynamic_cast<TControl*> (FindComponent("Tritratrulala")); // Oder statt TControl TLabel o.ä. if (ctrl != 0) { // Was immer Du willst }Gruß,
Alexander
-
super das ein cast so auch funktioniert wusste ich noch nicht, danke. werde es mal versuchen.
so nun noch eine antwort auf meine dritte frage:
frage 3:
wie man ja unschwer erkennt sollen die elemente der form „markiert” werden, um sie eventuell zu verschieben, ähnlich der IDE des bcb. gibt es grundsätzlich eine fertige api-funktionalität, die mir so etwas ermöglicht? (ich kann mir nicht vorstellen das das über objekte (siehe hier shape1) der form passiert!?) also exakt so wie beim bcb? (so wie auch zum beispiel bei einer verschiebenung eines toolbars)?wenn ja, könnte mir da jemand ein simples beispiel geben?
gruß gerd
-
so, habe auch den speicherfehler aufgedeckt:
wenn man die components durchläuft muss man einen abziehen, steht zumindest im beispielcode der hilfe, dann stürzt es auch nicht mehr ab.

gruß gerd
-
Hallo,
Ich habe mir nun mal nicht alle 3 Seiten durchgelesen und weiss jetzt nicht, ob es schon eine Lösung gibt, aber mir ist folgendes aufgefallen :
Das geht so oder so nicht :
Du kannst nicht Components durchzählen und Controls benutzen.
Außerdem kann das new weg.
[cpp]
TControl *ChildControl = new TControl(Application);
for(int i=0; i < this->ComponentCount; i++)
{
ChildControl = this->Controls[i];
if(ChildControl->Visible)
ListBox1->Items->Add(ChildControl->Name);
}
[/cpp]Wenn dann so :
[cpp]
TControl *ChildControl;
for (int i=0; i < ControlCount; i++)
{
ChildControl = Controls[i];
if (ChildControl->Visible)
ListBox1->Items->Add(ChildControl->Name);
}
[/cpp]Bis dann denn,

Nash
-
Nash schrieb:
Wenn dann so :
Wenn ich das richtig sehe, dann bekommt man mit Controls[] nur die untergeordneten Controls - also Controls, deren
Parent-Eigenschaft in diesem Fall das Formular ist. Willst Du aber auch einen Button, der auf einem Panel liegt und
dann folglich als Parent eben dieses Panel hat, erreichen musst Du die gesamte Control-Hierarchie durchschreiten.
Mit Components bekommt man automatisch alle Komponenten, die auf dem Formular liegen. Hat man - wie in diesem Fall -
den Namen der Komponente zur Hand, dürfte FindComponent() der einfachste Weg sein, auch wenn man casten muss, um
an die gewünschten Eigenschaften zu kommen.
Interessant in dem Zusammenhang könnte außerdem noch ControlAtPos() sein (wieder nur für Unter-Controls), womit man
das Control anhand der Maus-Position ermitteln kann. Das könnte für Verschiebezwecke ganz praktisch sein.gerd01 schrieb:
wenn man die components durchläuft muss man einen abziehen, steht zumindest im beispielcode der hilfe
Die Hilfe bezieht sich doch nur auf die (beinahe schon triviale) Eigenart, dass der erste Index bei 0 und nicht bei
1 beginnt. Was hast Du denn jetzt gemacht?Gruß,
Alexander
-
die for-schleife mit "componentcount-1" laufen lassen, und schon klappt alles! er hatte an dieser stelle dann den index überschritten, aber dein casting vefahren habe ich eingebunden, scheint zu funzen. danke.
gruß gerd
-
Hallo,
Oops...
Das kommt davon, wenn man das nicht selber ausprobiert und mal schnell zwischendurch antwortet. Natürlich immer bis Count minus 1.
[cpp]TControl *ChildControl;
for (int i=0; i < ControlCount - 1; i++)
{
ChildControl = Controls[i];
if (ChildControl->Visible)
ListBox1->Items->Add(ChildControl->Name);
}[/cpp]Bis dann denn,

Nash
-
Ich verstehe nicht dieses Problem mit ComponentCount - 1 bzw. ControlCount - 1.

So wie von Nash vorgeschlagen...Nash schrieb:
[cpp]TControl *ChildControl;
for (int i=0; i < ControlCount - 1; i++)
{
ChildControl = Controls[i];
if (ChildControl->Visible)
ListBox1->Items->Add(ChildControl->Name);
}[/cpp]... wird doch wohl ein Control unterschlagen?
Zum Test habe ich mal einfach eine neue Anwendung erstellt, ein Panel (Panel1) darauf platziert und
auf diesem wiederum (nur zum Test) ein Label (Label1) und einen Button (Button1). Außerdem liegt
direkt auf dem Form noch ein Memo (Memo1) und ein weiterer Button (Button2), in dessen OnClick-Ereignis
ich folgendes geschrieben habe:void __fastcall TForm1::Button2Click(TObject *Sender) { Memo1->Lines->Clear(); Memo1->Lines->Add("List of components"); Memo1->Lines->Add("---------------------------"); for (int i = 0; i < ComponentCount; ++i) { Memo1->Lines->Add(Components[i]->Name); } Memo1->Lines->Add(""); Memo1->Lines->Add("List of controls"); Memo1->Lines->Add("---------------------------"); for (int i = 0; i < ControlCount; ++i) { Memo1->Lines->Add(Controls[i]->Name); } }Es gibt hier keinerlei Exceptions o.ä. und im Memo steht nach Anklicken des Button2:
List of components
---------------------------
Panel1
Label1
Button1
Memo1
Button2List of controls
---------------------------
Panel1
Memo1
Button2Wie man erkennt werden - korrekterweise - insgesamt die vorher erwähnten fünf Komponenten aufgelistet
und die 3 Unter-Controls des Formulars. Da Label1 und Button1 auf dem Panel1 liegen erscheinen sie
nicht in der Controls-Auflistung des Formulars.Was passiert denn da bei Euch?
Gruß,
Alexander
-
stimmt, die minus eins ist nicht entscheident, irgenwie hakt mein proggie immer noch, wenn ich zu schnell ein andere control wähle!
mache ich es langsam, dann klappt auch! *wunder* *kopfkratz*
gruß gerd
-
also ich raffe es nicht, sollte doch jetzt eigentlich funzen, nur irgendwie bekomme ich immer nen komisches fenster unter winxp, erst ist der rahmen des fensters normal, dann ändert er sich irgendwann. auch wenn ich langsam klicke?!
hier nochmal mein kompletter quellcode
header:
//--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // Von der IDE verwaltete Komponenten TListBox *ListBox1; TListBox *ListBox2; TLabel *Label1; TLabel *Label2; TCheckBox *CheckBox1; TButton *Button1; TEdit *Edit1; TGroupBox *GroupBox1; TPanel *p; TListBox *ListBox3; TShape *Shape1; void __fastcall ListBox1Click(TObject *Sender); void __fastcall FormCreate(TObject *Sender); void __fastcall FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y); void __fastcall FormMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); void __fastcall pMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); private: // Anwender-Deklarationen public: // Anwender-Deklarationen __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endifquellcode:
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; bool Start=false; // im moment unwichtig //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::ListBox1Click(TObject *Sender) { ListBox2->Items->Clear(); TControl* ctrl; // Objekte mit Panel durchlaufen for( int i = 0 ; i < p->ControlCount ; i++ ) { ctrl = dynamic_cast<TControl*> ( FindComponent( p->Controls[i]->Name ) ); if( ctrl->HasParent() && ctrl != 0 ) { p->Controls[i]->Left = p->Left + 5; p->Controls[i]->Top = p->Top + 5; p->Controls[i]->Parent = this; p->Left += 5; p->Top += 5; p->Width -= 5; p->Height -= 5; } } ctrl = dynamic_cast<TControl*> (FindComponent(ListBox1->Items->Strings[ListBox1->ItemIndex])); // Objekt mit Panel hinterlegen if ( ctrl != 0 ) { ListBox2->Items->Add(ctrl->Name); p->Left = ctrl->Left - 5; p->Top = ctrl->Top - 5; p->Width = ctrl->Width + 10; p->Height = ctrl->Height + 10; ctrl->Parent = p; ctrl->Left = 5; ctrl->Top = 5; ctrl->Width = p->Width - 10; ctrl->Height = p->Height - 10; p->Visible = true; } } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { for( int i=0; i < this->ControlCount ; i++ ) { if( this->Controls[i]->Visible ) ListBox1->Items->Add( this->Controls[i]->Name ); this->Controls[i]->Visible = true; } Shape1->Visible = false; p->Visible = false; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { // Start = true; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { /* if(Start) { //Shape1->Width = X - Shape1->Left; //Shape1->Height = Y - Shape1->Top; }*/ } //--------------------------------------------------------------------------- void __fastcall TForm1::FormMouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { /* ListBox2->Items->Clear(); TRect rectc,rects; for( int i=0; i < this->ControlCount; i++ ) { if( this->Controls[i]->Name != "Shape1" ) { rectc = this->Controls[i]->BoundsRect; rects = Shape1->BoundsRect; if (rectc.Left >= rects.Left && rectc.right <= rects.right && rectc.Bottom <= rects.bottom && rectc.top >= rects.top) ListBox2->Items->Add(this->Controls[i]->Name); } } Start=false;*/ } //--------------------------------------------------------------------------- void __fastcall TForm1::pMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { ReleaseCapture(); SendMessage(dynamic_cast <TPanel*>(Sender)->Handle,WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); } //---------------------------------------------------------------------------vielleicht noch ne idee?
gruß gerd
-
Was veranstaltest Du denn in ListBox1Click()?

Vielleicht kannst Du davon mal eine kommentierte Version posten.Es wäre bestimmt sehr hilfreich (nicht nur für außenstehende), den Variablen aussagekräftigere Namen als
Listbox1 oder p zu geben. Dann würde sich der Code wie normaler Text lesen lassen. Man könnte auch sagen:Jetzt ist es Quell-Code, dann wäre es (vielleicht) Quell-Text.
Vielleicht würdest Du dann auch selbst besser erkennen, wo Dein(e) Fehler liegt/liegen.
Aber ein heißer Kandidat scheint mir auf jeden Fall ListBox1Click() zu sein. Versuche doch mal die Routine
in zusammengehörige Blöcke zu zerlegen und diese Blöcke zu beschreiben.Gruß,
Alexander