![]() |
programm friert ein, progress bar, leerzeichen ignorieren...
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo leute,
Also ich bin ja gerade drann, ein crc32 check programm zu schreiben, jetzt habe ich aber noch ein paar probleme. Also zuerst mal was ich schon hingekriegt habe:
Und hier meine Probleme:
wäre wirklich nice wenn ihr mir bei diesen Problemen helfen könntet :mrgreen: hab mal meinen code angehängt, interessant ist zurzeit eigentlich nur unit1 vielen dank schonmal mfg headi |
Re: programm friert ein, progress bar, leerzeichen ignoriere
Hi,
Zitat:
Zitat:
Mittels RightStr kannst du dir den Teilstring rechts von einer Position zurückgeben lassen, mit LeftStr den Links von einer Position, copy ist auch eine Möglichkeit (gibt noch viele weitere). Hier könntest du absolut die 8 Zeichen benutzen oder um flexibler zu bleiben kannst du dir mit LastDelimitter die Position des letzten Auftrauchens eines Zeichens (bei dir also Space) zurückgeben lassen. Eine weitere Alternative wäre es natürlich, dir durch ein TStringList Objekt und gesetztem Delimitter den String in alle Einzelteile zerlegen zu lassen und alle ausser dem letzten wieder zusammen zu setzen (hier aber vorher einen String anlegen, der alle anderen aufnehmen kann). Um Kommentare zu filtern (sind doch Zeilenkommentare?), kannst du dir mittels Pos die Position eines ";" zurückgeben lassen. Der String der dich dann interessieren sollte geht von 1 bis Pos(';', geleseneZeile) - 1 Ja, warum bei crc das Programm einfriert kann ich jetzt natürlich nicht sagen (noch nicht deinen Code geladen). Fortschrittsanzeige? Sollte eigentlich kein Problem sein. Musst dir nur überlegen, wann du die am sinnvollsten updatest (also nicht 100000 Schritte, wenn nur 100 verschiedene angezeigt werden). Am einfachsten denke ich kann man soetwas mit einer Methode machen, die bei einem Fortschritt aufgerufen wird. Da gibt es dann mehrere Möglichkeiten, die einfachste wäre es einfach einen Fortschrittsbalken zu übergeben. Ist aber unschön, du wärst natürlich an diesen gebunden und es müsste für eine andere Komponente der Code geändert werden. Eine weitere Möglichkeit bestünde darin, einfach einen Methodenzeiger (procedure(const progress : Cardinal) of Object) zu definieren und dann halt eine Methode zuzuweisen. Alternativ (und etwas mehr OOP) einfach ein Interface definieren, dass eine solche Methode deklariert und dann in dein Objekt, in dem der Fortschritt stattfindet ein Listener-Modell einbauen (also registerListener, notifyListener und removeListener), dann kannst du beliebig viele Objekte über einen Fortschritt informieren (eben alle registrierten Listener). Gruß Der Unwissende |
Re: programm friert ein, progress bar, leerzeichen ignoriere
hmmm... ich krieg das einfach nicht hin,
also zum ersten Problem: Ich habe mir die tipps nochmals angeschaut, die du mir gegeben hast. Ich habe es jetzt geschafft, jedes wort anzusprechen, aber irgendeine gute funktion konnte ich nicht basteln. Ich möchte ja nicht den ganzen code den ich schon habe wieder umschreiben. bis jetzt sieht dieser code so aus:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject); //sfv file öffnen
begin if OpenDialog1.Execute then begin SL := TStringList.Create; SL.LoadFromFile(OpenDialog1.FileName); //sfv daten in stringlist speichern SL.Delimiter :=' '; SLSub := TStringList.Create; StringGrid1.RowCount:=SL.Count+1; //stringgrid zeilen erstellen for I := 0 to SL.Count - 1 do begin SLSub.DelimitedText := SL[I]; StringGrid1.Cells[0, (1+(I))]:=SlSub[0]; //dateiname in stringgrid einfügen StringGrid1.Cells[2, (1+(I))]:=SlSub[1]; //hash wert in stringgrid einfügen StringGrid1.Cells[1, (1+(I))]:='ready'; //status gleich ready end; end; end; dann zum zweiten Problem: Ja es sind zeilenkommentare. Mit dem pos bin ich irgendwie auch nicht weitergekommen, irgendwie habe ich immer probleme mit den verschiedenen Formaten, also Strings, string, integer... drittes Problem: Also ich glaube, das ist ja sogar normal dass ein Programm bei längeren berechnungen einfriert, aber ich glaube das kann man doch mit einem thread oder so umgehen?! Nur habe ich leider keine Ahnung davon. viertes Problem: Also das mit dem Fortschrittbalken krieg ich glaub nicht hin, da ich erstens zu wenig ahnung davon habe, und zweitens habe ich durch die componente die mir das ganze berechnet irgendwie zu wenig informationen. Ich werde dort jetzt einfach einen Fortschritsbalken anzeigen, der hin und her fahrt. :lol: vielen dank schonmal, Ich hoffe ihr könnt mir das noch ein bisschen genauer erklären mfg headi |
Re: programm friert ein, progress bar, leerzeichen ignoriere
Zitat:
Delphi-Quellcode:
Hier übergibst du einfach zwei StringListen. Die erste enthält den originalen Inhalt inklusive den Kommentaren. Die zweite kann ruhig leer sein (der Inhalt wird auf jeden Fall gelöscht). Es wird nun jede Zeile der ersten Liste genommen und immer der Teil in die zweite Liste kopiert, der vor einem Kommentar kommt. Statt Pos(';' ... ) solltest du lieber eine Konstante benutzen, falls du von ';' mal auf etwas anderes wechseln möchtest.
procedure extractComments(const ListWithComments, ListWithoutComments : TStringList);
var i : Integer; begin // nachschauen, dass keine Referenz = nil ist if assigned(ListWithComments) and assigned(ListWithoutComments) then begin // löschen der Liste in die alle Zeilen ohne Kommentar kommen ListWithoutComments.Clear; // schauen ob es mindestens eine Zeile gibt if ListWithComments.Count > 0 then begin // übertragen der Einträge, dabei aber jeden Kommentar löschen for i := 0 to ListWithComments.Count - 1 do begin // wenn Zeile einen Kommentar enthält // > 1 -> keine Zeile die nur ein Kommentar ist wird kopiert if Pos(';', ListWithComments.Strings[i]) > 1 then begin // kopieren des Teils der nicht zum Kommentar gehört ListWithoutComments.Add(copy(ListWithComments.Strings[i], 1, Pos(';', ListWithComments.Strings[i])); end // if Pos(';', ListWithComments.Strings[i]) > 1 // sonst die Zeile unverändert kopieren else begin ListWithoutComments.Add(ListWithComments.Strings[i]); end; end; // for i := 0 to ListWithComments.Count - 1 end; // if ListWithComments.Count > 0 end; // if assigned(ListWithComments) and assigned(ListWithoutComments) end; Zitat:
Wenn du eine große Schleife hast, die etwas berechnet und es nur lange dauert, da die Anzahl der Iterationen sehr groß ist, solltest du alle paar Durchläufe ein Application.ProcessMessages einbauen. Dieser Befehl lässt Windows auch andere Nachrichten verarbeiten, die sonst nicht zum Zuge kämen (betrifft dann u.A. neuzeichnen und verschieben von Fenstern). So, jetzt guck ich doch nochmal in deinen Code. Ach Moment, du benutzt ein paar Komponenten, könntest du bitte angeben welche? (ist immer leichter sich Quellcode anzusehen, wenn man alle Komponenten kennt). Ach und bitte nicht die .exe in ein zip, sondern nur die Files die man zum selber kompilieren braucht (hab nur einen ISDN Kanal zur Verfügung). Gruß Der Unwissende |
Re: programm friert ein, progress bar, leerzeichen ignoriere
Zitat:
Die einfachste Variante ist die Aktualisierung mit einem Timer zu lösen. Die Werte aus dem Thread schreibt man sich in eine globale Variable (oder auch Liste oder wie auch immer) und gibt diese dann mit dem Timer aus. Es ist einfacher als man denkt und hilft ungemein :-) |
Re: programm friert ein, progress bar, leerzeichen ignoriere
Liste der Anhänge anzeigen (Anzahl: 2)
so hab jetzt mal dein code ausprobiert, aber der funktioniert irgendwie nicht richtig.
Folgende Fehlermeldung: Zitat:
Delphi-Quellcode:
procedure extractComments(const ListWithComments, ListWithoutComments : TStringList);
var i : Integer; begin // nachschauen, dass keine Referenz = nil ist if assigned(ListWithComments) and assigned(ListWithoutComments) then begin // löschen der Liste in die alle Zeilen ohne Kommentar kommen ListWithoutComments.Clear; // schauen ob es mindestens eine Zeile gibt if ListWithComments.Count > 0 then begin // übertragen der Einträge, dabei aber jeden Kommentar löschen for i := 0 to ListWithComments.Count - 1 do begin // wenn Zeile einen Kommentar enthält // > 1 -> keine Zeile die nur ein Kommentar ist wird kopiert if Pos(';', ListWithComments.Strings[i]) > 1 then begin // kopieren des Teils der nicht zum Kommentar gehört ListWithoutComments.Add(copy(ListWithComments.Strings[i], 1, Pos(';', ListWithComments.Strings[i]))); end // if Pos(';', ListWithComments.Strings[i]) > 1 // sonst die Zeile unverändert kopieren else begin ListWithoutComments.Add(ListWithComments.Strings[i]); end; end; // for i := 0 to ListWithComments.Count - 1 end; // if ListWithComments.Count > 0 end; // if assigned(ListWithComments) and assigned(ListWithoutComments) end; procedure TForm1.Button1Click(Sender: TObject); //sfv file öffnen var SLwithcomments: TStringList; begin if OpenDialog1.Execute then begin SLwithcomments := TStringList.Create; SL.LoadFromFile(OpenDialog1.FileName); //sfv daten in stringlist speichern extractComments(SLwithcomments, SL); SL.Delimiter :=' '; SLSub := TStringList.Create; StringGrid1.RowCount:=SL.Count+1; //stringgrid zeilen erstellen for I := 0 to SL.Count - 1 do begin SLSub.DelimitedText := SL[I]; StringGrid1.Cells[0, (1+(I))]:=SlSub[0]; //dateiname in stringgrid einfügen StringGrid1.Cells[2, (1+(I))]:=SlSub[1]; //hash wert in stringgrid einfügen StringGrid1.Cells[1, (1+(I))]:='ready'; //status gleich ready end; end; end; Zitat:
Ich habe wirklich noch nie einen thread erstellt. Vorallem habe ich ja nur einen Befehl in meinem code, der rest überniehmt dann die componente!! Achja der Befehl lautet so:
Delphi-Quellcode:
Achja hab mal noch die componente angehängt und mein code ohne exe :thumb:
SZCRC32File(FileName);
Danke schon mal mfg headi |
Re: programm friert ein, progress bar, leerzeichen ignoriere
Zitat:
Einfach die Komp. TJvThread auf das Formular ziehen und den Aufruf der anderen Komponente in TJvThread.OnExecute reinschreiben. Zum Starten rufst du dann TJvThread.Execute auf. Der Event OnBegin informiert Dich, dass der Thread gestartet wurde. OnFinish bzw. OnFinishAll informiert Dich (das Programm), dass der Thread beendet ist. Eigentlich alles wie gehabt, nur das Fenster friert nicht mehr ein. Aber du musst noch abfangen, wenn das Programm einfach so beendet wird, bevor der Thread fertig ist. Entweder Du hast die Möglichkeit der Komp. das mitzuteilen (hallo, mach mal Schluss), oder du verhinderst das Beenden solange bis OnFinish/OnFinishAll gekommen ist. Als weitere Möglichkeit bietet sich auch an (vor allem auf Mehr-CPU-Systemen) die Berechnung von mehreren Dateien parallel zu verarbeiten, dann nutzt du auch alle CPUs aus und nicht nur eine. Ich werde morgen mal sehen und dort eine Thread-Version reinstellen ... alte Menschen müssen jetzt schlafen ;-) |
Re: programm friert ein, progress bar, leerzeichen ignoriere
Zitat:
[Fehler] Unit1.pas(95): E2035 Nicht genügend wirkliche Parameter die zeile lautet Thread1.Execute; Irgendwie müsste da noch ein pointer rein oder so glaube ich zumindest!?? Danke schon mal für deine hilfe mfg headi |
Re: programm friert ein, progress bar, leerzeichen ignoriere
Ich vermute, die Create-Methode will noch eine Boolean-Variable, die angibt, ob der Thread angehalten erzeugt oder gestartet erzeugt wreden soll (true für angehalten, false damit er gleich das arbeiten anfängt, sobald er erschaffen ist) ;)
|
Re: programm friert ein, progress bar, leerzeichen ignoriere
Zitat:
hmmm... was muss ich da angeben?? Was ist ein pointer Hilfeeee... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz