Autor |
Beitrag |
Kay E.
      
Beiträge: 118
|
Verfasst: Sa 18.06.11 01:52
Hallo zusammen!
Ich habe das Problem, dass ich eine Prozedur habe, die als Komponenten einen Button, einen SaveDialog und ein Edit-Feld benutzt. Im Editfeld steht bei Programmstart "Choose File" und der Button ist Disabled. Gedacht ist, wenn der Benutzer ein File ausgewählt hat, wird der ConvertButton freigegeben. Die Prozedur ist der derzeit einzige Code in der ganzen Unit. Schauts euch mal an:
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: 45: 46: 47: 48: 49: 50:
| unit GUI;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
type TNoitzenConverterForm = class(TForm) ConverterMemo: TMemo; ConvertButton: TButton; Bevel1: TBevel; UrsprungFilePathEdit: TEdit; ZielFilePathEdit: TEdit; UrsprungFilePathButton: TButton; ZielFilePathButton: TButton; Label1: TLabel; ConverterPathEdit: TEdit; ConverterPathButton: TButton; Label2: TLabel; IntegrateButton: TButton; Label3: TLabel; SaveDialog: TSaveDialog; procedure ConverterPathButtonClick(Sender: TObject); private public end;
var NoitzenConverterForm: TNoitzenConverterForm;
implementation
{$R *.dfm}
procedure TNoitzenConverterForm.ConverterPathButtonClick(Sender: TObject); begin SaveDialog.InitialDir := ExtractFilePath(ConverterPathEdit.Text);
if SaveDialog.Execute then begin ConverterPathEdit.Text := SaveDialog.FileName; ConvertButton.Enabled := True; end; end;
end. |
Jetzt das kuriose. Wenn ich das erste Mal auf den Button klicke, funktioniert alles, wie es soll. Klicke ich ein zweites mal drauf, meldet sich Windows mit "Das Programm xxx funktioniert nicht mehr, es wird nach einer Lösung gesucht". Die Stelle, an der die Meldung kommt ist das SaveDialog.execute. Dabei ist es unerheblich, ob ich beim ersten Execute auf Ok klicke oder abbreche (also unabhängig davon was im Edit-Feld steht).
Wechsle ich zum Test den SaveDialog gegen einen OpenDialog, funktioniert es.
Wo ist das Problem? Ich bin frustriert, weil ich bei so einem kleinen winzigen Stück Code so hängen bleibe. Wäre super, wenn ihr mir helfen könntet.
Danke schonmal!
Grüße Kay
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Sa 18.06.11 07:22
Frage, wie konntest Du das Programm überhaupt kompiliere? Es steht in der Zeile 46 ConvertButton statt ConverterButton. Hast Du noch ein anderes Objekt mit dem Namen ConvertButton in dem Quelltext? Ich habe es mit den drei Komponenten ausprobiert. Es funktioniert bei mir problemlos auch mehrmals. Allerdings geht es nicht, wenn beim Start der Button nicht enabled ist, da ja das Editfeld keine (hier im Codebeispiel) sichtbare Ereignisroutine besitzt, so dass der Button enabled wird.
Wenn Du den Button nach einer Operation enablen möchtest, darfst Du das nicht in der OnClick-Routine des Buttons tun. Denn wenn der Button disabled ist, wird diese nie aufgerufen. Du müsstest dies in der OnClick-Prozedur des Editfeldes tun.
P.S.. Den kleinen Dreher im Namen des Formulars habe ich korrigiert. Passiert mich auch ständig.
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: 45: 46:
| unit Conv;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TNotizenConverterForm = class(TForm) ConverterButton: TButton; SaveDialog: TSaveDialog; ConverterPathEdit: TEdit; procedure ConverterButtonClick(Sender: TObject); procedure ConverterPathEditClick(Sender: TObject); private public end;
var NotizenConverterForm: TNotizenConverterForm;
implementation
{$R *.DFM}
procedure TNotizenConverterForm.ConverterButtonClick(Sender: TObject); begin ConverterButton.Enabled := FALSE; end;
procedure TNotizenConverterForm.ConverterPathEditClick(Sender: TObject); begin SaveDialog.InitialDir := ExtractFilePath(ConverterPathEdit.Text);
if SaveDialog.Execute then begin ConverterPathEdit.Text := SaveDialog.FileName; ConverterButton.Enabled := True; end;
end;
end. |
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
Kay E. 
      
Beiträge: 118
|
Verfasst: Sa 18.06.11 10:58
Ich denke, an der Gui ist es ersichtlichwie ich das meine:
Das Editfeld ist ConverterPathEdit
Der Buttonrechts davon (Caption Choose File) ist ConverterPathButton
Der Button drunter (Caption Convert) ist ConvertButton, ist zur Entwicklerzeit Enabled := False;
Der Benutzer soll also über ConverterPathButton den Dialog aufrufen, dessen Filename wird in ConverterPathEdit geschrieben und ConvertButton wird Enabled.
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Sa 18.06.11 12:35
Ich würde zum testen die Zeile
Delphi-Quelltext 1:
| SaveDialog.InitialDir := ExtractFilePath(ConverterPathEdit.Text); |
auskommentieren. Vielleicht geht es dann?
Wählst du mit dem SaveDialog eine Datei auf dem Desktop aus? Ich hatte unter Vista mal das Problem, dass Save- als auch Open-Dialog das Programm abstürzen lies wenn man zum Desktop navigierte. Der Auslöser war eine inkompatible Shellerweiterung.
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Sa 18.06.11 12:41
Also, das lag an den ähnlichen Bezeichnungen, Entschuldigung. Aber nichtsdestotrotz, ich habe es nun so, wie Du gesagt hast, umgesetzt. Bei mir gibt es keine Probleme, egal wie oft ich Converterpathbutton aufrugfe.
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: 45: 46: 47:
| unit GUI;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TNotizenConverterForm = class(TForm) ConvertButton: TButton; SaveDialog: TSaveDialog; ConverterPathEdit: TEdit; ConverterPathButton: TButton; procedure ConvertButtonClick(Sender: TObject); procedure ConverterPathButtonClick(Sender: TObject); private public end;
var NotizenConverterForm: TNotizenConverterForm;
implementation
{$R *.DFM}
procedure TNotizenConverterForm.ConvertButtonClick(Sender: TObject); begin ConvertButton.Enabled := FALSE; end;
procedure TNotizenConverterForm.ConverterPathButtonClick(Sender: TObject); begin SaveDialog.InitialDir := ExtractFilePath(ConverterPathEdit.Text);
if SaveDialog.Execute then begin ConverterPathEdit.Text := SaveDialog.FileName; ConvertButton.Enabled := True; end;
end;
end. |
Zu Andreas: Wenn in dem Edit kein Text steht (Was ich als Anfangsbedingung habe, bei meinem Kleinprogramm, dann passiert bei Initialdir nichts. Ich arbeite mit Windows 7, habe Visat nie genutzt,m daher kann es natürlich bei Vista Probleme geben. Jedoch weder bei Windows 2000 noch XP noch Windows 7 gab es da je Probleme bei meinen Programmen.
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
Kay E. 
      
Beiträge: 118
|
Verfasst: Mo 20.06.11 11:45
Also ich hab jetzt das Programm unmodifiziert auf meinem Uni-Rechner kompiliert und getestet. Hier funktioniert alles einwandfrei. Kompiliert wurde mit Delphi XE auf einem Vista System.
Daheim hab ich ne Studentenversion von Delphi 2010 auf einem Win7 64Bit System - da funktioniert es auch weiterhin nicht...
Irgendwelche ideen?
|
|
Andreas L.
      
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Mo 20.06.11 12:26
Kay E. hat folgendes geschrieben : |
Daheim hab ich ne Studentenversion von Delphi 2010 auf einem Win7 64Bit System - da funktioniert es auch weiterhin nicht...
Irgendwelche ideen? |
Wie schon gesagt: Sind bei dir irgendwelche Shellerweiterungen (z. B. von einem Pack- oder Antiviren-Programm) installiert? Weil es nur auf deinen Rechner nicht geht, liegt die Vermutung nahe dass eben bei dir eine Software Probleme bereitet.
Du kannst das Kompilat auch hier hochladen, damit wir es auf unseren PCs testen können.
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Mo 20.06.11 15:15
Probier doch mal den Kompatibilitätsmodus von Windows 7 (XP oder Vista). Vielleicht klappt es ja dann. Vielleicht liegt es ja an der 64bit-Version. Gibt es da eigentlich in Delphi 2010 irgendwelche Einstellungen, die man beim Kompilieren auf 64bit-Systemen beachten muss? Weiß das jemand?
_________________ Toleranz ist eine Grundvoraussetzung für das Leben.
|
|
Kay E. 
      
Beiträge: 118
|
Verfasst: Di 21.06.11 14:29
Ich wollte gestern abend das kompilierte Programm hochladen und hab es vorher nochmal getestet, weil ich sichergehen wollte, dass ich nicht die neuere Version versehentlich hochlade. Wie sihc herausgestellt hat, funktioniert das kompilierte Programm einwandfrei, während es im Debug-Modus in Delhi zu den besagten Abstürzen kommt. Das hatte ich nicht erwartet, deswegen hab ichs nicht getestet gehabt. Wie's aussieht, muss das wohl ne Delphi-Interne Geschichte sein, da der Fehler nur in der Delphi IDE zur Debug-Laufzeit auftritt. Das kompilierte Programm unabhängig von Delphi gestartet läuft wie bereits beschrieben einwandfrei.
Schon merkwürdig das.
|
|
thepaine91
      
Beiträge: 763
Erhaltene Danke: 27
Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
|
Verfasst: Di 21.06.11 15:29
Das dein Programm im Debug Modus abstürzt und anders nicht heist noch lange nicht das der Fehler nicht trotzdem ausgelöst wird. Ganz im Gegenteil ich gehe davon aus der Fehler besteht immernoch und er wird nur geschluckt.
|
|
|