logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Delphi 7 - Zawieszanie się przy ponownym użyciu OpenDialog/SaveDialog

Wojtek44 29 Cze 2007 19:38 7411 10
REKLAMA
  • #1 4033684
    Wojtek44
    Poziom 27  
    Posty: 1065
    Pomógł: 96
    Ocena: 72
    Witam

    Oferuję za pomoc 200 punktów.

    Programuje w Delphi 7. Od pewnego czasu zauważyłem, że gdy napiszę procedurkę korzystającą z OpenDialog lub z SaveDialog i otwieram przy jej pomocy jakiś plik odczytuję (lub zapisuję) dane to za pierwszym razem wszystko jest OK natomiast przy próbie powtórnego użycia tego pliku program wiesza się.

    Przykładowa procedura dla pliku tekstowego:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    if OpenDialog1.Execute then
    Lista.Items.LoadFromFile(OpenDialog1.FileName);
    end;

    przy pierwszym naciśnięciu przycisku jest OK lista zapełnia się danymi z pliku natomiast naciskając przycisk ponownie pojawia się błąd:

    Delphi 7 - Zawieszanie się przy ponownym użyciu OpenDialog/SaveDialog

    Sytuacje identyczne są opisane w poniższych linkach ale nikt nie dał konkretnej odpowiedzi:

    http://www.programuj.com/forum/viewtopic.php?p=9263&sid=c99eb7b6ce1dfaa7dfe8f76cf0467a90

    http://forum.ks-ekspert.pl/index.php?showtopic=83847

    Co ciekawe dzieje się to tylko przy otwieraniu lub zapisie plików z pulpitu.
    Gdy plik znajduje się w innej lokalizacji ten problem nie występuje.

    Gdy zmienię w przykładowej procedurce sposób pobierania nazwy pliku na:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
    Lista.Items.LoadFromFile(Edit1.Text); // w edit1 ścieżka do pliku
    end;

    problem nie występuje.

    Dzieje mi się tak na dwóch komputerach połączonych w sieć.
    Ktoś w podanych linkach wspomniał ,że być może dzieje się to u niego po zainstalowaniu komponentu ComPort, ja ten komponent mam także zainstalowany.

    Przeinstalowanie delphi nic nie zmienia, instalowanie delphi bez comport też nic.

    Nie chce przeinstalowywać systemu!

    Co robić ?


    [url][/url][url][/url]
  • REKLAMA
  • #2 4033827
    Minner
    Poziom 19  
    Posty: 289
    Pomógł: 20
    Ocena: 3
    procedure TForm1.Button1Click(Sender: TObject); 
    begin 
    if OpenDialog1.Execute then 
    Lista.Items.LoadFromFile(OpenDialog1.FileName); 
    end;

    nie wiem czemu Ci nie działa, ale spróbuj zamienić to na

    procedure TForm1.Button1Click(Sender: TObject); 
    begin 
    OpenDialog1.Execute;
    end;
    
    procedure TForm1.OpenDialog1CanClose(Sender: TObject;
      var CanClose: Boolean);
    begin
    Lista.Items.LoadFromFile(OpenDialog1.FileName); 
    end;

    nie wiem czy pomoże, ale spróbować można ;)
  • REKLAMA
  • #3 4033842
    Wojtek44
    Poziom 27  
    Posty: 1065
    Pomógł: 96
    Ocena: 72
    To co napisałem powinno działać. I interesują mnie tylko sposoby aby mi to działało.
  • REKLAMA
  • #4 4034527
    Minner
    Poziom 19  
    Posty: 289
    Pomógł: 20
    Ocena: 3
    wiesz na odległość ciężko pomóc, gdy masz taki nietypowy problem, więc najlepiej jak sam popróbujesz różne warianty na pierwszy ogień wywaliłbym komponent ComPort, bo chyba rzeczywiście on jest winowajcą (ja nie mam tego a program mi działa)
    Na pewno są jakieś inne komponenty którymi da się go zastąpić. Chyba nawet w Indy powinno coś być.
  • REKLAMA
  • #5 4038581
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    Witam,

    taka procedura

    Cytat:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    if OpenDialog1.Execute then
    Lista.Items.LoadFromFile(OpenDialog1.FileName);
    end;


    nie może generować takiego błędu jaki opisałeś.

    Pokaż lepiej cały prosty kod jaki napisałeś i wtedy uda się pokazać gdzie robisz babola.

    pozdrówka
  • #6 4042183
    Wojtek44
    Poziom 27  
    Posty: 1065
    Pomógł: 96
    Ocena: 72
    mirekk36 nie robię babola.
    Przeczytaj dokładnie mój post, potem posty w tych linkach, które podałem.
    Ta procedura to cały program. Na innych komputerach działa poprawnie a u mnie nie.
    Jeszcze raz proszę przeczytać mój post i posty z linków , które zamieściłem bo to jest identyczny problem.
    Wojtek
  • #7 4042710
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    Witam

    przeczytałem twoje posty do których umieściłeś linki. Jedno co wiem po tej lekturze to to, że w każdym piszesz niby o tym samym ale podajesz inne przykłady i chyba w każdym robisz błędy, na które zwracają ci uwagę forumowicze a ty nadal twierdzisz, że nie robisz babola. Ja w takich przypadkach nigdy nie twierdzę, że nie robię babola a gdy mi coś nie działa to z uporem maniaka szukam najpierw do bólu błędu "u siebie"

    i tak np na jedym z forów podałeś też przykład w delphi gdzie robisz podstawowy błąd ponieważ pętlę for i:=0 to Stringlist.Count robi się jak podpowiedział ci jakiś użytkownik fori i:=0 to StringList.Count-1 i już samo to może wywalać ci błąd chociaż niekoniecznie typu AccesViolation.

    W innym miejscu gdzie podawałeś przykład w C++ też ktoś ci pokazał gdzie robisz błąd a ty nadal swoje, że to nie o to chodzi

    kolejna sprawa - w jakiejś tam procedurze kreujesz "ręcznie" obiekt TMemo i po tym jak z nim dalej robisz i się obchodzisz, widać że jeszcze nie do końca jesteś w tym wprawiony. Więc to również powoduje że przypuszczam, że robisz gdzieś jakiś błąd dziwny, związany ze złym gospodarowaniem pamięcią i kreowanymi obiektami. Natomiast uznajesz że tam nie może być błędu i pokazujesz jedynie ten fragment w którym tobie się wydaje że masz błąd. Rozumiesz?

    prześlij mi na priv'a całego unita a w zasadzie projekt w którym ci to wyskakuje a powiem ci o co chodzi.

    poza tym wszystkim błąd typu acces violation nie jest wcale taki straszny - przecież podawany masz tam adres błędu. Wystarczy więc abyś wpisał go w czasie debugowania i kompilator sam ci pokaże albo miejsce w twoim kodzie gdzie leży babol albo jeśli jest on głębszy to możesz sobie wyświetlić okno z kodem programu w asemblerze i tam też dojdziesz chociażby na zasadzie sprawdzenia nagłówka nazwy procedury gdzie ci to się wywala. Wtedy sam będziesz miał jasność. Trzeba tylko nauczyć się posługiwać narzędziem jakie masz pod ręką. Wbrew pozorom debugowanie w delphi jest naprawdę w miarę dobre i w wielu takich przypadkach szybko potrafi pomóc nawet jak mówię w przypadkach acces vilationów ;)

    wybierz więc formę w jakiej mogę ci pomóc albo kod na priv'a albo sam pobaw się debugerem i zobaczysz co jest nie tak

    pozdrówka

    ... aha dodam tylko, że nie staram się pomóc dla punktów, które oferujesz - tak tylko , poprostu dla idei ;)
  • #8 4046116
    Wojtek44
    Poziom 27  
    Posty: 1065
    Pomógł: 96
    Ocena: 72
    Witam
    mirekk36 nie zrozum mnie źle wiem doskonale, że to ja proszę o pomoc ale od pomagających wymagam co najmniej przeczytania ze zrozumieniem tego co napisałem i pomoc a nie naskakiwanie o niewiadomo co.

    1. Nigdzie nie napisałem, że podałem linki do swoich postów wręcz przeciwnie - napisałem o autorze jednego z postów :

    Cytat:
    Ktoś w podanych linkach wspomniał


    Aby nie było żadnych wątpliwości piszę , że podane linki nie prowadzą do moich postów. Znalazłem je w sieci ponieważ opisują mój problem a czytając opisy trzech różnych ludzi można dowiedzieć się dużo więcej niż z opisu jednego.

    2. Twierdzę , że nie robię babola w moim programie który CAŁY przytoczyłem w pierwszym poście i o czym napisałem w kolejnym:

    Cytat:
    Ta procedura to cały program.


    No chyba ,że Cię jeszcze wygląd tego buttona na formatce interesuje.

    3. Program jest napisany poprawnie i jak już wcześniej ja pisałem:

    Cytat:
    Na innych komputerach działa poprawnie a u mnie nie.


    oraz kolega z pierwszego linka :

    Cytat:
    No coż ten sam projekt skompilowany na innym kompie chodzi bez zarzutu. Projekt skompilowany na moim kompie wywalał się moim i na innym kompie. Ale gdy utworzyłem nowego urzytkownika na moim kompie i zalogowałem się na tym koncie programik działał bezproblemowo.
    Znajdę chwilę czasu to sprawdzę wariant z przeinstalowaniem bcb.


    Mało tego :

    Cytat:
    Co ciekawe dzieje się to tylko przy otwieraniu lub zapisie plików z pulpitu.
    Gdy plik znajduje się w innej lokalizacji ten problem nie występuje


    4. Wiem, że winę za taką pracę programu ponosi Delphi lub system a dokładnie któreś ustawienia które wprowadził najprawdopodobniej ComPort lub może coś innego.

    5.Co do śledzenia miejsca w którym występuje błąd w programie przy pomocy debugowania pisał o tym kolega z drugiego linka:

    Cytat:
    no i w tym miejscu program sie wywala:


    CYTAT
    if open.Execute then



    6. Post mój kierowałem do osób, które zetknęły sie z takim przypadkiem i potrafiły go rozwiązać.
    Nie oczekiwałem aby ktoś na swoim ,sprawnym (bez ustawień które u mnie coś knocą) komputerze odpalając mój programik który specjalnie sprowadziłem do jednej procedurki i u kogo ta procedurka działa poprawnie rozwiązał mój problem.

    Oczywiście najprościej gdy sie czegoś nie rozumie lub nie wie doszukiwać się winy w moim programie.
    Ja zanim napisałem ten post

    Cytat:
    to z uporem maniaka szukam najpierw do bólu błędu "u siebie"


    Wojtek
  • #9 4046920
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    Witam,

    oczywiście ty też nie zrozum mnie źle, nie czepiam się tylko wypytuję (fakt nie zauważyłem że to nie twoje posty w tych linkach ale....)

    rozumię, że na twojej formie położyłeś poprostu buttona , ListBoxa oraz OpenDialog'a ??? (czyli nic dynamicznie po drodze nie tworzysz?) i to wszystko? tak? - efekt jest powtarzalny z tym accesviolation za każdym razem gdy od nowa kładziesz na formę te trzy komponenty i piszesz ten kawałek kodu tak?

    - po pierwsze w 100% nie może być za to odpowiedzialny ComPort, tak się składa, że bardzo dobrze znam ten komponent i często z niego w życiu korzystałem, poza tym ma on otwarte źródła więc sam możesz sobie zobaczyć, że on nic dziwnego nie robi w środku.

    po drugie rozumiem, że ten błąd wyskakuje ci przy nawet minimalnej ilości jakiegoś tekstu który jest ładowany tak??? np ze 3-4 znaki???

    aha i rozumiem, że gdy zastawisz pułapkę w debugerze tuż przed tym if'em to po naciśnięciu F8 ten błąd też wywala u ciebie właśnie na OpenDialog1.Execute ???

    jaki masz windows?

    poza tym spróbuj może zainstalować sobie tak dla sprawdzenia narazie jakiś inny komponent typu opendialog i sprawdź czy z nim będzie działać ok?

    a tak nawiasem tak się składa że ja też od kilku już ładnych lat działam na Delphi7, używam ComPorta , mam windę XP a kiedyś była winda 98 - i zapewniam cię że nigdy takich problemów nie zauważyłem u siebie. U Ciebie jest to tym bardziej dziwne, że występuje na 2 komputerach jak piszesz.
  • #10 4047056
    Wojtek44
    Poziom 27  
    Posty: 1065
    Pomógł: 96
    Ocena: 72
    Witam
    Cytat:
    rozumię, że na twojej formie położyłeś poprostu buttona , ListBoxa oraz OpenDialog'a ??? (czyli nic dynamicznie po drodze nie tworzysz?) i to wszystko? tak? - efekt jest powtarzalny z tym accesviolation za każdym razem gdy od nowa kładziesz na formę te trzy komponenty i piszesz ten kawałek kodu tak?


    Dokładnie tak. A jeszcze dokładniej chodzi o samo użycie OpenDialoga - O POBRANIE NAZWY PLIKU bo odczyt jak i zapis przebiega poprawnie.
    Błąd występuje powtarzalnie za każdym razem przy drugim góra trzecim użyciem OpenDialoga lub SaveDialoga.
    Procedurka druga którą podałem w pierwszym poście (gdzie nazwa pliku pobierana jest z Edita) działa natomiast poprawnie - co jeszcze raz wskazuje na moment użycia OpenDialoga a nie odczytu pliku.

    Cytat:
    - po pierwsze w 100% nie może być za to odpowiedzialny ComPort, tak się składa, że bardzo dobrze znam ten komponent i często z niego w życiu korzystałem, poza tym ma on otwarte źródła więc sam możesz sobie zobaczyć, że on nic dziwnego nie robi w środku.


    Z tego co ja znalazłem w sieci (podobne przypadki) to wspólną cechą jest produkt Borlanda oraz zainstalowany ComPort.
    Wcześniej oczywiście wszystko działało u mnie OK. ten problem wystąpił u mnie ostatnio nie potrafię sprecyzować kiedy konkretnie ale jestem pewien ,że w tym czasie zainstalowałem jedynie ComPort z nowych rzeczy.

    Cytat:
    po drugie rozumiem, że ten błąd wyskakuje ci przy nawet minimalnej ilości jakiegoś tekstu który jest ładowany tak??? np ze 3-4 znaki???


    Tak. A nawet nie musze wogóle otwierać pliku - mogę dać w OpenDialog - ANULUJ i tez problem występuje - chodzi o samo wywołanie OpenDialog.

    Cytat:
    aha i rozumiem, że gdy zastawisz pułapkę w debugerze tuż przed tym if'em to po naciśnięciu F8 ten błąd też wywala u ciebie właśnie na OpenDialog1.Execute ???


    Dokładnie. Koledze z drugiego linka też.

    Cytat:
    jaki masz windows?


    XP.

    Cytat:
    U Ciebie jest to tym bardziej dziwne, że występuje na 2 komputerach jak piszesz.


    Ale ja na tych komputerach mam praktycznie te same programy różnią sie zupełnie hardwarem więc to można wykluczyć

    Wojtek
  • #11 4047262
    mirekk36
    Poziom 42  
    Posty: 9195
    Pomógł: 964
    Ocena: 2289
    hmmm problem rzeczywiście dziwny w takim razie, ja jednak daję sobie głowę oberżnąć nożem ;) , że to nie wina Delphi skoro reinstalowałeś i wszystkie pliki wgrały się ponownie poprawnie. Coś jednak czuję , że pomoże tylko reinstalacja biednej windy. Oczywiście to nie żadna pomoc z mojej strony ale sam jestem ciekaw czy uda ci się to jakoś rozwiązać więc będę śledził ten wątek i jeśli ktoś coś konkretnego podpowie lub ty do czegoś dojdziesz to z chęcią również posłucham o co chodziło (jeśli uda się bez reinstalki windowsa). Chyba że mi jeszcze po drodze jakiś pomysł przyjdzie to też dam znać

    powodzenia

Podsumowanie tematu

✨ Problem dotyczy zawieszania się aplikacji napisanej w Delphi 7 podczas wielokrotnego użycia komponentów OpenDialog lub SaveDialog do wyboru pliku. Pierwsze wywołanie działa poprawnie, natomiast przy drugim lub trzecim uruchomieniu dialogu program ulega zawieszeniu lub generuje błąd Access Violation. Kod przykładowej procedury jest prosty i polega na załadowaniu zawartości pliku do listy po wybraniu pliku w OpenDialog. Problem jest powtarzalny i występuje nawet gdy użytkownik anuluje dialog. Wskazuje się, że przyczyną może być konflikt z komponentem ComPort zainstalowanym w systemie, który może wpływać na działanie dialogów plikowych w Delphi 7. Inni użytkownicy potwierdzają, że na ich komputerach bez ComPort problem nie występuje. Próby modyfikacji kodu i debugowania nie przyniosły rozwiązania. Sugerowano również, że problem może leżeć po stronie systemu operacyjnego (Windows XP) lub samego środowiska Delphi, a reinstalacja systemu mogłaby pomóc. Nie znaleziono jednoznacznej poprawki, a dyskusja podkreśla konieczność dalszej diagnostyki i ewentualnej zamiany komponentu ComPort na inny, np. z biblioteki Indy.
REKLAMA