infoarena

Comunitate - feedback, proiecte si distractie => Off topic => Subiect creat de: Dobre Catalin Andrei din Mai 08, 2005, 19:55:22



Titlul: Help PLS!!!!
Scris de: Dobre Catalin Andrei din 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:
Cod:

+---------------------------------+
|                                 |
|  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 :
Cod:

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!


Titlul: Help PLS!!!!
Scris de: cristi8 din 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


Titlul: Help PLS!!!!
Scris de: Valentin Stanciu din 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!


Titlul: Help PLS!!!!
Scris de: Cristian Strat din 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.
Cod:
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!


Titlul: Help PLS!!!!
Scris de: mindphobia din Mai 09, 2005, 11:41:43
Citat din mesajul lui: svalentin
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.


Titlul: Help PLS!!!!
Scris de: Dobre Catalin Andrei din 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  :wink:


Titlul: Help PLS!!!!
Scris de: Dobre Catalin Andrei din 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  :roll:
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...


Titlul: Help PLS!!!!
Scris de: Cristian Strat din Mai 09, 2005, 17:23:45
c'mon dude, trebuia sa te prinzi :)

1. aici ai functia independenta
Cod:
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
Cod:
WebBrowser1.Navigate('about:blank');
ca sa se initializeze


un exemplu de utilizare:
Cod:
WbLoadFromStrings(wb, Memo1.Lines);


Titlul: Help PLS!!!!
Scris de: Dobre Catalin Andrei din Mai 09, 2005, 17:41:54
O gramada de THX  :wink:
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  8)


Titlul: Help PLS!!!!
Scris de: Radu Grigore din 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.


Titlul: Help PLS!!!!
Scris de: Dobre Catalin Andrei din 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  :)


Titlul: Help PLS!!!!
Scris de: Radu Grigore din 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.


Titlul: Help PLS!!!!
Scris de: Dobre Catalin Andrei din 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.  :)


Titlul: Help PLS!!!!
Scris de: Cristian Strat din 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  :D

Oricum, probabil e suficient pentru un atestat.


Titlul: Help PLS!!!!
Scris de: Dobre Catalin Andrei din 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