Button Dynamisch -> BN_CLICKED

DJneu hat gesagt.:
bedeutet das, jedesmal wenn ein Control aufgerufen wird wird die Funktion
OnCtlColor aufgerufen?
So ähnlich. Kurz bevor sich das Control neu zeichnet, sendet es eine WM_CTLCOLOR-Message an das Elternfenster (also den Dialog), damit hier bei Bedarf Zeichenoptionen geändert werden können.
DJneu hat gesagt.:
Ich bekomme aber einen Fehler
Denke irgendwie ist da noch was nicht Initialisiert
Hat mit dem Timer was zu tun!!
Die Implementierung des Timers ist ok, aber nicht der Aufruf. SetTimer() kann nur aufgerufen werden, wenn das Fenster des Dialogs schon erzeugt wurde, also etwa mit Create() oder DoModal().
Wenn du den Timer sowieso immer zusammen mit dem Dialog starten willst, kannst du auch in deiner Dialog-Klasse einen Handler für die Nachricht "WM_INITDIALOG" einfügen und dort sämtliche Initialisierungen, also auch SetTimer(), eintragen.

Beim nächsten Problem wäre es wirklich besser, einen neuen Thread aufzumachen, denn inzwischen haben wir uns doch etwas vom eigentlichen Thema entfernt ;)

Gruß
MCoder
 
Jo machen wir :p

Das problem ich hab 10 Unterdialoge, in welchem jeweils ein Timer läuft wenn
der Dialog ausgewählt wird.
Die Dialoge werden beim Starten des Programmes alle Initialisiert
(dann kann man schön mit Schleifen arbeiten)
Wenn ich das über InitDialog machen möchte hab ich ein Problem!
Dann muss ich die Startprozedur umschreiben!
Wie heist eigentlich das Gegenstück zu Create?

Aufruf: Create -> Meldung: OnInitDialog
Aufruf: DestroyWindow -> Meldung: OnDestroy

Gruß
 
Sooooo,

da bin ich nochmal :)

Wir hatten weit oben im Beitrag schon mal über Memory leaks gesprochen :) :) :)
Nachdem im Moment alles so einigermaßen klappt,
hab ich beschlossen das ich mich mal an den Tip mit den Memory leaks mache!
Zu dem habe ich jetzt Probleme nach der Umstellung auf Create und Destroy

Ich denke da Passiert was, wenn ich mit Destroy meinen Dialog schliesse,
teilweise Control's vergesse und ihn dann wieder Create erzeuge

Das mit

for (index = 0 ....
{
CSliderCtrl *ForceSlider = (CSliderCtrl*) GetDlgItem (ainForceSlider + index) ;
ForceSlider -> DestroyWindow () ;
}

für dynamische Static's, Edit's usw. klappt nicht!?
Was hab ich nu nieder falsch verstanden?

Gruß
 
Was genau klappt denn nicht? Falls du den "CSliderControl" irgendwann mal mit "new" erzeugt hast, muss hinter "DestroyWindow()" noch ein "delete ForceSlider;" kommen.

Gruß
MCoder
 
Hi,

erstes Problem mit den Memory leaks gelöst :)
Hab den Fehler gemacht das ich dieses delete bei keinen
der Control's genutzt hatte. Das gilt ja dann
für alle dynamisch erzeugten CEdit, CStatic, CProgressCtrl, CSliderCtrl denn
nu bekomm ich hier keine Meldungen mehr.

Mein zweites Problem ist folgendes:
Ich Klicke auf mein Registerkarte, hier durch Create ich einen Dialog mit den
oben genannten Control's. Ein Timer läuft los holt und zeigt Daten mit diesen
Control's an.
Nun klicke ich auf eine andere Registerkarte, der alte Dialog und seine Control's
werden mit Destroy und delete aufgeräumt!

Wenn ich diese Registerkarte nun erneut auswähle war es das!
Ich bekomme eine Meldung "Unbhandelte ausnahme.... 0xC000000005"

im Debug springt er dann auf das File AFXCMN2.H
in die Zeile mit folgendem Code:

_AFXCMN_INLINE int CProgressCtrl::SetPos(int nPos)
{ ASSERT:):IsWindow(m_hWnd)); return (int) ::SendMessage(m_hWnd, PBM_SETPOS, nPos, 0L); }

Nu steh ich da wie der Ochse vor dem Berg :)

Gruß Dirk
 
Wenn du einen Dialog samt seinen Controls aufräumst und später wieder wieder reinklickst, müsstest du ja mit "Create" auch wieder alles neu erzeugen. Hast du mal kontrolliert, ob das richtig klappt? Die Fehlermeldung sagt aus, dass das Fenster zum Progress-Control nicht existiert, d.h. dir geht irgendwo ein "Create" ab.

Gruß
MCoder
 
Hallo,

so jetzt hab ich mal geschaut was ich da getrieben hab :rolleyes:
Hab ich im Code total vergessen die Control's vorher wieder zu Createn.......
Der Tipp hat ins schwarze getroffen!

Die andere Fehlermeldung ist glaub noch etwas besser ! :)

Genauso wie vorher beim 2. mal anklicken kommt die Meldung:

1.Meldung
Benutzerdefinierter Haltepunkt aus Quellcode aufgerufen bei 0x77f667cd, dann

2* Sprung in Assembler Code, dann

2. Windows Fehlermeldung Meldung
Im Programm *.exe .............
File wingdi.cpp
Line 1120

Muss ich den Dialog auch mit delete Löschen?
Ich hab das folgendermaßen gemacht:

Löschen der Dialoge:

void CRegisterPLC::OnLButtonDown(UINT nFlags, CPoint point)
{
CTabCtrl::OnLButtonDown(nFlags, point);

if(RegisterPLCAktuelleSeite != GetCurFocus())
{
RegisterPLCSeite [RegisterPLCAktuelleSeite] -> ShowWindow (SW_HIDE) ; // Dialog unsichtbar
RegisterPLCSeite [RegisterPLCAktuelleSeite] -> DestroyWindow( ) ; // Dialog Löschen
// delete RegisterPLCSeite [RegisterPLCAktuelleSeite] ;
RegisterPLCAktuelleSeite = GetCurFocus ( ) ; // Angecklickte Seite ermitteln
RegisterPLCSeite [RegisterPLCAktuelleSeite] -> Create (IDDRegPLCSeiten [RegisterPLCAktuelleSeite], this) ; // Neuen Dialog erstellen
RegisterPLCSetzeDimension (RegisterPLCAktuelleSeite) ; // Dialog an Register anpassen
RegisterPLCSeite [RegisterPLCAktuelleSeite] -> ShowWindow (SW_SHOW) ; // Dialog anzeigen
RegisterPLCSeite [RegisterPLCAktuelleSeite] -> SetFocus ( ) ; // Dialog Fokusieren
}
}


Löschen der CStatic's, CEdit's usw.:


for( index = 0 ; index < 36 ; index ++ )
{
CEdit *dinTextEdit = (CEdit*) GetDlgItem (dinText + index) ;
dinTextEdit -> DestroyWindow () ;
delete dinTextEdit ;
}

for( index = 0 ; index < 36 ; index ++ )
{
CStatic *dinForceBitmap = (CStatic*) GetDlgItem (dinForceHiLo + index) ;
dinForceBitmap -> DestroyWindow() ;
delete dinForceBitmap ;
}


Nach überspringen der Fehlermeldungen wird der Dialog wieder korrekt angezeigt
aber die control's ändern sich nicht mehr?
Was kann das nur sein

Gruß Dirk
 
Hallo, ich kann jetzt nicht erkennen, woher der Fehler rühren könnte. Du solltest mal versuchen, die OnLButtonDown()-Methode in der kritischen Situation schrittweise zu debuggen, um festzustellen, bei welcher Programmzeile es schiefgeht.

Gruß
MCoder
 

Neue Beiträge

Zurück