•dobre
|
|
« : Mai 08, 2005, 19:55:22 » |
|
Am nevoie repede de ajutor... Lucrez la un atestat pentru un prieten si am un bug pe care nu stiu cum sa-l rezolv. Am facut un editor simplu de HTML. Arata cam asa: +---------------------------------+ | | | web browswer | | | <- aici arata pagina | | | | +---------------------------------+
+---------------------------------+ | | | Editor(gen Notepad) | | | <- Editor | | | | +---------------------------------+
In momentul in care scriu sau sterg o litera din Editor salveaza un fisier "temp.html" iar apoi Web Browser-ul incarca fisierul.... codul arata asa : procedure TForm1.Memo1Change(Sender: TObject); begin Memo1.Lines.SaveToFile('temp.html'); WebBrowser1.Navigate('d:\jhj\temp.html'); //am scris calea direct... end;
Problema: In momentul in care scriu mai repede imi da eroare si spune : 'Cannot create file d:\jhj\temp.html' . The process cannot acess the file because it is being used by another process. Atestat-ul il puteti descaraca de pe pagina : http://ofgods.com/cata/atestat/ Proiectul este arhivat SFX. Va rog mult , daca stiti sa rezolvati problema scrieti-mi cat mai repede posibil... Multumesc anticipat!
|
|
|
Memorat
|
|
|
|
cristi8
Vizitator
|
|
« Răspunde #1 : Mai 08, 2005, 21:31:51 » |
|
1. ai putea sa pui un timer si sa updatezi html-ul periodic 2. ai putea sa pui un buton de "preview" si arata site-ul doar cand dai pe el daca vrei neaparat cu apasatul butoanelor... ori ai putea sa "prinzi" eroarea si sa updatezi iar in jumate de secunda, sau... sa salvezi tempSS (unde SS sunt secundele de la ceas ) ) si sa le stergi la un moment dat.. ... poate mai au si altii alte idei.. ...eu as prefera prima varianta, cu un timer la jumate de secunda sa updateze htmlul daca s-a modificat textul
|
|
|
Memorat
|
|
|
|
•svalentin
|
|
« Răspunde #2 : Mai 09, 2005, 07:28:34 » |
|
Pai un ideea e ca Windowsul primeste "ordine" sa scrie fisierul, dar intai il pune in cache, deci daca faci 2 operatii succesive diferite trebuie sa ai un mic delay sau ceva intre ele (mi se pare ca prinzi SO in momentul cand scrie cache-ul pe harddisc). O idee ar fi sa dai flush dupa write, asa forteaza SO sa scrie tot ce are in cache! Nu m-am uitat pe sursa dar cred ca asta va rezolva problema!
|
|
|
Memorat
|
|
|
|
•wickedman
|
|
« Răspunde #3 : Mai 09, 2005, 08:46:52 » |
|
Problema apare pentru ca tu rescrii temp.html din care browser-ul inca mai citeste. Nu scapi de problema nici daca pui doar un timer. Nu ai de unde sa stii cat dureaza incarcarea paginii. 1. Pune un timer care sa dea refresh periodic (daca s-au facut modificari) insa, inainte sa dea refresh, sa interogheze proprietatea "ReadyState" a controller-ului. Daca e READYSTATE_COMPLETE atunci ai unda verde. 2. Baga cod HTML direct in browser, fara sa mai folosesti fisiere temporare. function WbLoadFromStrings(wb: TWebBrowser; const AStrings: TStrings): HResult; var M: TMemoryStream; begin if not Assigned(wb.document) then AssignDocument(wb); M := TMemoryStream.Create; try AStrings.SaveToStream(M); Result := LoadFromStream(wb, M); except Result := S_FALSE; end; M.free; end; 1 si 2 sunt complementare. Daca faci doar 2 vei mai primi mesaje de eroare in functie de PC/versiunea IE/cat de repede scrii. Have fun!
|
|
|
Memorat
|
|
|
|
mindphobia
Vizitator
|
|
« Răspunde #4 : Mai 09, 2005, 11:41:43 » |
|
Pai un ideea e ca Windowsul primeste "ordine" sa scrie fisierul, dar intai il pune in cache, deci daca faci 2 operatii succesive diferite trebuie sa ai un mic delay sau ceva intre ele (mi se pare ca prinzi SO in momentul cand scrie cache-ul pe harddisc). O idee ar fi sa dai flush dupa write, asa forteaza SO sa scrie tot ce are in cache! Nu m-am uitat pe sursa dar cred ca asta va rezolva problema! wrong idea, vezi post-ul lui wickedman pentru solutia corecta.
|
|
|
Memorat
|
|
|
|
•dobre
|
|
« Răspunde #5 : Mai 09, 2005, 14:36:05 » |
|
THX all Legat de timer... Nu merge, cum trebuie + tot se aude sunetul ala aiurea cand incarca pagina... Am incercat cu un delay dar tot nu merge... Wickedman mersi pentru cod o sa incerc asa, sper sa si inteleg tot ce face acolo ca trebuie sa-l si explic
|
|
|
Memorat
|
|
|
|
•dobre
|
|
« Răspunde #6 : Mai 09, 2005, 14:57:20 » |
|
Hmm acum vad... Imi da ceva eroare... Majoritatea instructiunilor nu le-am folosit niciodata si imi este greu sa-l modific sa vad cum ii bine...Daca poti sa rescri codul corect Imi da eroare la AssignDocument. Si sincer nu prea stiu cum sa folosesc functia ... Ce face? pune in bowser linie cu linie!? Daca poti sa dai un exemplu cum se foloseste functia... Sau o pagina web din care sa ma documentez... M-am uitat prin Help, mi-am dat seama in mare cam ce face...
|
|
|
Memorat
|
|
|
|
•wickedman
|
|
« Răspunde #7 : Mai 09, 2005, 17:23:45 » |
|
c'mon dude, trebuia sa te prinzi 1. aici ai functia independenta function WbLoadFromStrings(wb: TWebBrowser; const AStrings: TStrings): HResult; var M: TMemoryStream; begin M := TMemoryStream.Create; try AStrings.SaveToStream(M); M.seek(0, 0); Result := (wb.Document as IPersistStreamInit).Load(TStreamAdapter.Create(M)); except Result := S_FALSE; end; M.free; end;
2. nu uita sa dai "uses ActiveX" 3. in event-ul OnCreate al formularului trebuie sa apelezi WebBrowser1.Navigate('about:blank'); ca sa se initializeze un exemplu de utilizare: WbLoadFromStrings(wb, Memo1.Lines);
|
|
|
Memorat
|
|
|
|
•dobre
|
|
« Răspunde #8 : Mai 09, 2005, 17:41:54 » |
|
O gramada de THX Ce sa mai zic esti bun. In mare am inteles cam ce face... O sa mai sap acum Mersi mult, daca ne intalnim fac cinste cu o bere
|
|
|
Memorat
|
|
|
|
•rgrig
|
|
« Răspunde #9 : Mai 10, 2005, 10:54:36 » |
|
Doar o idee (in plus fata de ce a spus wickedman, nu in loc de...): 1. de fiecare data cand user-ul tasteaza ceva setezi un timer la valoarea constant_delay 2. de fiecare data cand timer-ul ajunge la zero trimiti html-ul la browser (timer-ul este unul singur pe aplicatie) In felul asta sunt sanse mici sa gasesti browser-ul ocupat cand vrei sa-i trimiti date fiindca n-o sa incerci niciodata sa o faci la un interval mai mic de constant_delay. In plus mie ca utilizator mi-ar placea mai mult un comportament de genul asta. PS: Nu stiu pascal/delphi (banuiesc ca asta e ce scrie mai sus ) asa ca nu stiu cat de usor e de implementat ce am spus.
|
|
|
Memorat
|
|
|
|
•dobre
|
|
« Răspunde #10 : Mai 10, 2005, 15:16:35 » |
|
Initial asa am facut(salvam pe HDD fisierul "temp.html" si apoi il incarcam in browser) dar daca fac cu un timer tot timpul se aude un sunetul cand incarca, si sa o tot auzi din 0.3 in 0.3 s ii cam enervant... Totusi asi putea pune un delay(t) in momentul in care observ ca in memo s-a schimbat ceva, dar cred ca dupa fiecare tasta apasata trebuie sa mai astepti inca t sec pentru a scrie alta litera.Si nici asa nu rezolv problema. Cu codul lui wickedman nu mai este problema, deci nu cred ca are rost sa pun o temporizare... ii OK nu mi-a facut nici o figura... Totusi THX pentru sugestie
|
|
|
Memorat
|
|
|
|
•rgrig
|
|
« Răspunde #11 : Mai 10, 2005, 17:37:07 » |
|
Eu nu am sugerat nimic legat de modul de transfer al informatiilor.
In varianta in care refresh-ul se face periodic independent de ce tasteaza utilizatorul programul are sansa sa para "sacadat". Daca insa refresh-ul se face la 0.5s dupa ce utilizatorul termina de tastat (1 tasta sau 30) look&feel-ul este dupa parerea mea mai bun. Daca mi-aduc bine aminte exact comportamentul asta (poate cu alta constanta de timp) l-am vazut la unele editoare de HTML (HomeSite?).
Ce am zis legat de timer era doar o sugestie de implementare, care habar n-am daca e fezabila in mediul in care lucrezi tu.
|
|
|
Memorat
|
|
|
|
•dobre
|
|
« Răspunde #12 : Mai 10, 2005, 20:49:51 » |
|
Nu ai citit acolo cu atenti , ti-am spus cum l-am facut eu si cum am folosit temporizarea.... Am inteles ce vrei sa zici tu dar, proiectul ii ok , nu apare nici macar o intentie de sacadare... Daca totusi esti curios sa vezi cum arata intra pe http://ofgods.com/cata/. Project1.SFX.exe Nu ar avea rost sa fac un refresh la 0.5 secunde din moment ce totul este OK. Nu ti se pare mai fain ca atunci cand tastezi sa-ti apara imediat si rezultatul... Mersi pentru sugestii, dar sunt multumit de stadiul in care se afla atestat-ul. P.S Daca sesizezi ceva bug-uri pls sa-mi spui.
|
|
|
Memorat
|
|
|
|
•wickedman
|
|
« Răspunde #13 : Mai 10, 2005, 22:53:12 » |
|
Nu am download-at proiectul dar rgrig le zice bine. Erori nu ai sa vezi ca doar interoghezi ReadyState. Daca insa vei lucra cu un HTML de cativa MB o sa ti se para al naibii de suparator sa astepti dupa fiecare tasta. Daca tot merge bine, schimba PC-ul Oricum, probabil e suficient pentru un atestat.
|
|
|
Memorat
|
|
|
|
•dobre
|
|
« Răspunde #14 : Mai 11, 2005, 05:59:37 » |
|
Aha , am inteles, nici nu mi-a trecut prin cap sa vad daca merge la fisiere atat de mari,paginile o sa fie gata facute(mici),cand prezinta atestat-ul trebuie sa arate doar ca functioneaza.... 10x
|
|
|
Memorat
|
|
|
|
|