Bonjour,
lorsque que je quitte mon application, cette erreur apparait :
" EOSError "Erreur système. Code 1400." Handle de fenêtre non valide "
A quoi est elle due ?
(si vous avez besoin de mon code pas de problème).
Merci de votre aide
Bonjour,
lorsque que je quitte mon application, cette erreur apparait :
" EOSError "Erreur système. Code 1400." Handle de fenêtre non valide "
A quoi est elle due ?
(si vous avez besoin de mon code pas de problème).
Merci de votre aide
A plein de choses dues à l'utilisation d'un handle qui ne correspond à aucun contrôle fenêtré Delphi (Fiche, Panel, bouton, etc : bref n'importe quel descendant de TWinControl), ou Windows (Fiche, Bouton, etc...).Envoyé par ired
Soit tu utilises une API windows de façon incorrecte, soit tu as du, malencontreusement réaffecter une variable (de type TForm, TPanel, Tbutton, TTreeview, etc...), en oubliant quelle contenait quelque déjà chose que tu devais détruire ou je ne sais quoi
ça peut être utileEnvoyé par ired
Bidouilleuse Delphi
Tu n'aurais pas fait un ShowMessage dans un Thread ? ou manipuler une Forme depuis un Thread ... j'ai eu ce problème dans ces situations là !
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Merci pour vos réponses!Envoyé par ShaiLeTroll
Malheureusement pas de showmessage depuis un thread.
Que veux tu dire par manipuler une form ?
Salut
J'ai eu cette erreur lorsque j'essayais de parenter un composant avec un autre pas encore "fini de créer"
Si tu nous montrait du code, on pourrait mieux t'aider
Pedro
Aucune réponse aux sollicitations techniques par MP
Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)
Les pages Source C'est bon. Mangez-en!
Le défi Delphi
Règles du forum - FAQ Delphi - Pensez au chtit
Aéroclub Bastia Saint-Exupéry
Depuis ton Thread faire ceci par exemple
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part FrmServeur.StatusBarServeur.Panels[SB_PANEL_IMPORT].Text := '[Trieuse] Import AS400-PC : Optimisation des Tables Produit \ Commandes : Sélection du Catalogue...';
Des trucs qui ont l'air tout simple, cela fonctionne, 9999/10000 fois, et la fois où ça passe pas tu as soit l'Erreur 1400, soit un Ecran Bleu (si les options de reboot sur erreur irrémédiable sont décochées), soit une Violation d'Accès puis le 1400 à la fermeture du programme ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 FrmServeur.ProgressBarServeur.StepIt; FrmServeur.ProgressBarServeur.Hint := FloatToStr(PourcentageJauge) + ' %';
je l'ai vécu ...
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
alors j'ai deux threads et je fais ca :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 procedure Ttraitementpage.Execute; begin form1.Memo.lines.Text:=form1.HTTP1.Get(form1.Edit1.text); compteur2:=1; repeat begin string(unit1.code):=form1.Memo.Lines.ValueFromIndex[compteur2]; compteur2:=compteur2+1; end until pos(' ***********',string(unit1.code))<>0; form1.Edit2.Text:=unit1.code; termin:=true; end;
Tu vois une mouche dans le système ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 procedure Tdownload.Execute; begin form1.HTTP2.HandleRedirects:=true; // Permet la redirection Fs := TFileStream.Create('C:\wegettubetemp\temp.flv',fmCreate); //Nom du fichier local form1.HTTP2.Get(string(form1.Edit3.text),Fs); Fs.Free; //Liberer le flux end;
pas seulement une
[QUOTE=ired]
QUOTE]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 procedure Ttraitementpage.Execute; begin //là tu appel une form(vcl) tu doit passé par syncronise form1.Memo.lines.Text:=form1.HTTP1.Get(form1.Edit1.text); compteur2:=1; repeat //begin , pas la peine car déjà repeat c'est un bloc seul string(unit1.code):=form1.Memo.Lines.ValueFromIndex[compteur2]; compteur2:=compteur2+1; //end until pos(' ***********',string(unit1.code))<>0; // là tu as suprimer le teste de terminate until (pos(' ***********',string(unit1.code))<>0) and (not terminate); form1.Edit2.Text:=unit1.code; // encore un accée à vcl, et en plus tu peut remplacé ce ligne par un evenement termin:=true;// bah là je sais pas à cois sert :aie: end;
PAS DE DESTIN, C'EST CE QUE NOUS FAISONS
Merci pour ta réponse Edam!
Comme tu peu le voir je débute avec les threads
Peux tu m'expliquer le synchronise ? Je n'ai pas vraiment compris...
Peux tu aussi m'expliquer comment je peux exectuer du code que lorsque un thread est terminé ?
D'avance je te remercie beaucoup de me rendre moins bête
pour syncronise voir l'aide en ligne de delphi
pour attendre un thréad (ce qui est pas normal sauf si tu attend depuis un autre thréad ) c'est TThread.WaitFor
pour plus de détaille voir l'aide en ligne où tt le monde passe le voir avant de posté (mois j'ai apris plus de 50% de delphi dans son help )
[Edit]Example[/Edit]
PAS DE DESTIN, C'EST CE QUE NOUS FAISONS
Elimine le Mémo et remplace simplement par une TStringList déclaré en privé dans le Thread ...
Ensuite, fait un procédure pour répondre à l'évènement OnTerminate du Thread (cela se produit non pas en Thread mais dans le run VCL normale) pour recopier la TStringList dans le Mémo si cela doit s'afficher ...
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Merci Edam, je mettrai en application demainEnvoyé par edam
Je vais souvent voir dans le help, mais si je connaissais pas synchronise
ShaiLeTroll, oki je vais essayer aussi à ta manière
Merci pour votre aide les gars
Youhou ca marche!
Merci les gars, vous m'avez appris un truc !!
Passez une bonne journée, et paf un résolu en plus
Hello,
je me permet de remonter le topic. J'ai denouveau le même problème. Mais à la place de placer les instructions qui utilisent le thread principal dans un synchronize, j'ai utilisé des sections critiques. Et pourant, tjs cette erreur Code 1400." Handle de fenêtre non valide .... Vous avez une idée ?
tu n'as mis toutes tes manipulations de composants VCL dans un synchronize, ou sinon tu as des Create/Free d'objets qui doivent se mélanger entre Thread, des MessageBox ... Attention, aussi si tu as un DataModule, il vaut mieux l'instancier dans le Thread ... (pas dans le create mais dans le execute, j'ai fait l'erreur, et je pense que un de mes anciens projets pro qui tourne depuis tout de même 4 ans 12h/24 5j/7 en quasi-temps réel, n'est plus trop stable avec la DB après 24h non stop de locate/edit/post ...)
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Okay merci ShaiLeTroll
Je vais voir tout ça...
****************************************************
Je revient a ce fameux thread moi j'utilise tmyquery dans mon thread avant j'utilise pas synchronize j'avais le problème de handle de fenêtre non valide quand jais j'utilise synchronize le problème et disparut mais mon application et figer après l'exécution du thread
qui ne ressoude pas mon problème vue que je voulez utilise les thread pour cela, pour que mon application n'attend le serveur mysql.
****************************************************
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 unit select_pm; interface uses Classes,StdCtrls,SysUtils,Windows,MyAccess; type Tselect_pm = class(TThread) private { Déclarations privées } Fsociete_pm:TMyquery; procedure OnTerminateProcedure(Sender: TObject); protected procedure Execute; override; procedure UpdateCaption; public constructor Create(societe_pm : TMyquery); end; implementation uses Unit1; procedure Tselect_pm.Update; begin Fsociete_pm.SQL.Clear; Fsociete_pm.SQL.Add('select * from societe_pm'); Fsociete_pm.Execute; end; constructor Tselect_pm.Create(societe_pm : TMyquery); begin FreeOnTerminate := True; inherited Create(false); Fsociete_pm:=societe_pm; end; procedure Tselect_pm.Execute; begin Synchronize(UpdateCaption); end; end.
si c'est MyQuery de Devart\MyDAC, tu peux l'utiliser en Thread, veille juste à avoir aussi un objet connexion créé uniquement pour ce thread ...
surtout ne jamais utilisé un même query dans un thread secondaire et dans le main thread !
comme typiquement via un passage de paramètre !
Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
Attention Troll Méchant !
"Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
L'ignorance n'excuse pas la médiocrité !
L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
Il faut avoir le courage de se tromper et d'apprendre de ses erreurs
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager