programm problem mit code
-
Der Code sieht jetzt schon mal wesentlich lesbarer aus, wobei ich den Namen pnlBehinder seltsam finde.
Die Variable Start würde ich in den private-Bereich der Formularklasse legen und im Konstruktor initialisieren.
Für den Markierungsrahmen würde ich mir vielleicht sogar eine eigene Klasse erstellen, die eine Eigenschaft vom
Typ TControl* besitzt. In der set-Methode dieser Eigenschaft kannst Du dann alles fürs Zeichnen und Parent-Merken
bzw. -Setzen machen. Eine solche Klasse ist dann sehr einfach zu verwenden, indem man einfach das ausgewählte
Control der TControl*-Eigenschaft zuweißt. Aber das nur am Rande. Wenn's Dich interessiert, kann ich Dir auch mal
einen Vorschlag zeigen.gerd01 schrieb:
[cpp]
/*
@Alexander Kempf:
Warum ist der cast hier unwichtig? Hast Du mir doch selber gezeigt!
/
Und wofür brauchst Du FindComponent()?
Von welchem Typ ist pnlBehinder->Controls[i]?
Meine Aussage steht: Du brauchst hier keinen Cast, kein FindComponent() und auch keine if-Bedinung
ctrl = dynamic_cast<TControl> ( FindComponent( pnlBehinder->Controls[i]->Name ) );
if( ctrl != 0 && ctrl->HasParent() )
{/.../
...
Durch die oben beschriebene Verwendung einer zusätzlichen Klasse könntest Du das eleganter und
verständlicher lösen
/*
Wenn man das Gleiche Control wieder aus der ListBox1 (lstSelectableControls)
wählt, würde der Rahemn, wenn ich ihn im nachfogenden Code nicht wieder
verkleinere doppelt so breit um ein Control gesetzt werden, deshalb hier
der Abzug der Größen- und Positionsangaben
*/...
}void __fastcall TForm1::FormCreate(TObject *Sender)
{
for( int i=0; i < this->ControlCount ; i++ ) Wie bereits erwähnt werden so nur direkt auf der Form liegende Komponenten berücksichtigt
{
Warum nur sichtbare hinzufügen und anschließend auch unsichtbare anzeigen, aber nicht in Liste aufnehmen?
if( this->Controls[i]->Visible )
lstSelectableControls->Items->Add( this->Controls[i]->Name );Zaunpfahl: AddObject()
this->Controls[i]->Visible = true;
}
...
}[/cpp]Gruß,
Alexander
-
sinn und zweck war es daraus hinterher ne klasse zu bauen, nur habe ich keine ahnung wie ich es anstellen sollte, falls dein vorschlag mit einem beispiel steht, würde ich diesen gerne mal sehen daraus eine klasse zu konzipieren.
Und wofür brauchst Du FindComponent()?
Von welchem Typ ist pnlBehinder->Controls[i]?
Meine Aussage steht: Du brauchst hier keinen Cast, kein FindComponent() und auch keine if-Bedinungdu hast vollkommen recht, habe ich geschlafen!

Warum nur sichtbare hinzufügen und anschließend auch unsichtbare anzeigen, aber nicht in Liste aufnehmen?
damit wollte ich die listboxen rauslassen!

Zaunpfahl
addobject() kenne ich zwar, nur wie ich es verwende weiss ich nicht annähernd

gruß gerd
-
gerd01 schrieb:
sinn und zweck war es daraus hinterher ne klasse zu bauen, nur habe ich keine ahnung wie ich es anstellen sollte, falls dein vorschlag mit einem beispiel steht, würde ich diesen gerne mal sehen daraus eine klasse zu konzipieren.
Im Moment bin ich etwas knapp mit der Zeit. Vielleicht klappt's heute abend.
gerd01 schrieb:
damit wollte ich die listboxen rauslassen!

Das wäre doch eine kleine Erklärung Wert gewesen, oder?
gerd01 schrieb:
addobject() kenne ich zwar, nur wie ich es verwende weiss ich nicht annähernd

Bei TListBox gibt es auch noch AddItem(), was von der Funktionsweise aber AddObject() entspricht.
Beispiel:for (int i = 0; i < ControlCount; ++i) ListBox->AddItem(Controls[i]->Name, Controls[i]); // ...und beim Auswählen eines Listbox-Eintrags: TControl* ctrl = (TControl*) ListBox->Items->Objects[ListBox->ItemIndex];Schau Dir halt mal die BCB-Hilfe zu AddObject() und Objects[] an.
Gruß,
Alexander
-
ok, danke werde es mir mal ansehen, und das mit der erklärung die es wert sein müsste, ok ich habe es für mich eindeutig verstanden, ging also auch davon aus, dass andere es verstehen, fehler, kein anderer weiss es warum!

über das beispiel wäre ich sehr erfreut! wäre super wenn es klappt!

aber gibt es eigentlich nicht gleich vom bs her nen apicall, der das alles irgendwo schon anwedet? weil in office werden markierungen gebraucht, und in corel usw. ja auch. beim splitterbar hat er ja auch so eine linie als pattern, gibt es die nicht schon vom bs? nur ne vermutung meinerseits, oder schreiben sich sämtliche entwickler soetwas selber?
gruß gerd
ps:entgegen jeder meinung hier man würde die bcb hilfe nicht nutzen, ich nutze sie durchaus, nur manches davon ralle ich manchmal nicht, und verstehe es nur in verbindung mit ein paar zeilen code, das du das komplette controll dabei übergibst, ist jetzt wiederum eindeutig genug. ok, zu additem habe ich noch nicht nachgesehen, danke für die zeilen!

-
Hier mal ein paar Anregungen für eine "Decorator"-Klasse. Die Klasse funktioniert sogar. Dokumentation gibt's nicht,
da alles selbsterklärend ist
Zunächst der Header:
class TControlDecorator: public TPanel { public: __fastcall TControlDecorator(TComponent* Owner, TControl* ClientControl = 0); __property TControl* ClientControl = {read=FClientControl, write=setClientControl}; __property int FrameWidth = {read=getFrameWidth, write=setFrameWidth}; private: TControl* FClientControl; TShape* FFrame; void setClientControl(TControl* Value); int getFrameWidth(); void setFrameWidth(int Value); TShape* getFrame(); void __fastcall MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y); __property TShape* Frame = {read=getFrame}; };Und noch die Implementierung:
__fastcall TControlDecorator::TControlDecorator(TComponent* Owner, TControl* ClientControl): TPanel(Owner), FFrame(0) { this->ClientControl = ClientControl; OnMouseDown = MouseDown; Frame->OnMouseDown = MouseDown; } void TControlDecorator::setClientControl(TControl* Value) { if (Value != FClientControl) { if (FClientControl != 0) { FClientControl->Parent = Parent; Parent = 0; Visible = false; FClientControl->Left = Left + FrameWidth; FClientControl->Top = Top + FrameWidth; } FClientControl = Value; if (FClientControl != 0) { Parent = FClientControl->Parent; Left = FClientControl->Left - FrameWidth; Top = FClientControl->Top - FrameWidth; Width = FClientControl->Width + 2 * FrameWidth; Height = FClientControl->Height + 2 * FrameWidth; Visible = true; FClientControl->Parent = this; FClientControl->Left = FrameWidth; FClientControl->Top = FrameWidth; } } } int TControlDecorator::getFrameWidth() { return Frame->Pen->Width; } void TControlDecorator::setFrameWidth(int Value) { if (Frame->Pen->Width != Value) { TControl* ctrl = ClientControl; ClientControl = 0; Frame->Pen->Width = Value; ClientControl = ctrl; } } TShape* TControlDecorator::getFrame() { if (FFrame == 0) { FFrame = new TShape(this); FFrame->Parent = this; FFrame->Brush->Style = bsClear; FFrame->Align = alClient; } return FFrame; } void __fastcall TControlDecorator::MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { ReleaseCapture(); SendMessage(Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0); }Verwenden kann man das dann z.B. so:
void __fastcall TForm1::FormShow(TObject *Sender) { addSubControlsToListBox(this); } void TForm1::addSubControlsToListBox(TControl* AControl) { TWinControl* winControl = dynamic_cast<TWinControl*> (AControl); if (winControl != 0) for (int i = 0; i < winControl->ControlCount; ++i) { lbControls->AddItem(winControl->Controls[i]->Name, winControl->Controls[i]); addSubControlsToListBox(winControl->Controls[i]); } } void __fastcall TForm1::lbControlsClick(TObject *Sender) { ControlDecorator->ClientControl = (TControl*) lbControls->Items->Objects[lbControls->ItemIndex]; }Die ganze Rahmenmalerei ist jetzt in die Decorator-Klasse gewandert. Und genauso auch das Verschieben.
Bestimmt fallen Dir noch andere schöne Dinge ein, denn eigentlich sieht's ein bisschen hässlich aus...Gruß,
Alexander
-
cool, werde das ganze mal antesten und mein statement dann schreiben, erstmal danke ich dir. *gespannt*

gruß gerd
-
habe schwierigkeiten das ganze zu integrieren, kannste mir mal ein beispielprojekt an meine e-mail schicken? wäre nett von dir.
gruß gerd