![]() |
StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Hallo,
Ich habe folgendes Problem. Ich hab hier ein Programm, welches eine TXT Datei laden soll. Danach soll es aus den unterschiedlichen nummerischen Werten das Minimum, Maximum sowie das Arithmetische Mittel errechnen... Die TXT Datei besteht aus "zwei" Teilen. Ein Kommentar Bereich und eben die Werte. Also meine Überlegung wäre nun, den Kommentarbereich in ein Memo-Feld zuladen. Funktioniert auch... Die einzelnen Werte der TXT sind wohl am besten in einem StringGrid aufgehoben. Nun möchte ich aber die TXT erst aber einer gewissen Zeile (nämlich nach dem Kommentar-Bereich) laden...Wie stell ich das an? Hier erstmal die TXT:
Delphi-Quellcode:
So lade ich die TXT in das StringGrid:
'**************************************************************************
'LogView File; ScopeView Version:1.03 'Copyright 1994, AGA Associates. 'File Created: 10:20:24pm Nov 14, 03 '************************************************************************** 'Timebase: 00:00:01 'Hi Limit: Off 'Lo Limit: Off 'Filter Mode: Capture All Data; Filter Off '************************************************************************** 0020 C TE 09:20:01pm 0020 C TE 09:20:02pm 0020 C TE 09:20:03pm 0020 C TE 09:20:04pm 0021 C TE 09:20:05pm 0022 C TE 09:20:06pm 0023 C TE 09:20:07pm 0023 C TE 09:20:08pm 0024 C TE 09:20:09pm 0023 C TE 09:20:10pm 0023 C TE 09:20:11pm 0022 C TE 09:20:12pm 0020 C TE 09:20:13pm 0020 C TE 09:20:14pm 0019 C TE 09:20:15pm ....usw....
Delphi-Quellcode:
Aber wiegesagt, soll der Inhalt erst nach dem Kommentar-Bereich geladen werden (ab der 10 Teile).
procedure TForm2.btLadenClick(Sender: TObject);
var Datei: Textfile; ZeileIndex, SpalteIndex: integer; Zeile: string; //Laden der TXT in das StringGrid AssignFile(Datei, OpenDialog1.FileName); reset(Datei); ZeileIndex:=1; while not EoF(Datei) do begin readln(Datei, Zeile); SpalteIndex:=0; while pos(chr(9), Zeile) <> 0 do begin sgMess.Cells[SpalteIndex, ZeileIndex]:=copy(Zeile, 1, pos(chr(9), Zeile)-1); delete(Zeile, 1, pos(chr(9), Zeile)); inc(SpalteIndex); end; sgMess.Cells[SpalteIndex, ZeileIndex]:=Zeile; inc(ZeileIndex); //Tabelle automatisch um 1 Zeile erhöhen sgMess.RowCount:=sgMess.RowCount+1; end; CloseFile(Datei); //letze Zeile ist zuviel -> überstehende Zeile löschen sgMess.RowCount:=sgMess.RowCount-1; end; Kann mir jemand helfen? EDIT: Das erste Problem ist gelöst! Der der Inhalt wird erst nach dem Kommentar-Bereich, in das StringGrid geladen... Fehlt noch die Maximum, Minimum und Mittelwert bestimmung... |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
mh, da deine Kommentare mit ' zu beginnen scheinen könttest du bei jeder Zeile zunächst vergleichen ob das 1. Zeichen ein solches ist und diese ZEile dann ignorieren bzw überspringen ...
Edit: Also in dem Memo, nachdem du die Datei eingelesen hast:
Delphi-Quellcode:
while (memo1.lines.count>0) and (copy(memo1.lines[0],1,1 = '''') do
begin memo1.lines.delete(0); // das delete ist geraten, grad die syntax nicht im kopf end; |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Zitat:
Delphi-Quellcode:
Sowas funktioniert aber nicht...if pos(1, 1) = chr(96) then ShowMessage('Ist eins') else ShowMessage('Ist keins'); |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Hallo, wenn noch nicht gelöst, dann vielleicht so ...
Delphi-Quellcode:
while not EoF(Datei) do
begin readln(Datei, Zeile); if Zeile[1]<>'''' then begin // << zusätzlich SpalteIndex:=0; while pos(chr(9), Zeile) <> 0 do begin sgMess.Cells[SpalteIndex, ZeileIndex]:=copy(Zeile, 1, pos(chr(9), Zeile)-1); delete(Zeile, 1, pos(chr(9), Zeile)); inc(SpalteIndex); end; sgMess.Cells[SpalteIndex, ZeileIndex]:=Zeile; inc(ZeileIndex); //Tabelle automatisch um 1 Zeile erhöhen sgMess.RowCount:=sgMess.RowCount+1; end; // << zusätzlich end; |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Hm, wieso pos(1,1)=Chr(96) ???? Wenn schon, dann pos(chr(96),Zeile)=1 then ...
aber da ist kein #96, sondern ein #39 in deiner Datei |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Zitat:
Delphi-Quellcode:
Funktioniert leider nicht -> Exception!
if Zeile[1]<>'''' then begin // << zusätzlich
end; EDIT: Ich muss irgendwie jede Zeile überprüfen, ob das erste Zeichen ein #39 ist! Wenn ja soll die Zeile nicht ausgegeben werden. Wenn nicht wird einfach weitergemacht und nur Zeilen ohne #39 werden ausgegeben... Mh aber wie? |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
na, dann mit pos(#39,Zeile)=0 ...
|
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
|
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
"zeile" ist kein array, sondern nur ein string, oder?
also knallt zeile[1] auch. |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Jawohl, Zeile ist String...beides bringt die Exception...
Mh, was kann man da machen?! |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
die datei existiert auch? hast du den opendialog vorher aufgerufen und mit ok bestätigt? sonst steht in der eigenschaft Filename nix drin. ansonsten geh ma mit dem debugger durch un guck wo`s knallt. (Haltepunkt setzen mit F5, ausführen mit F9 bist du da ankommst, weiterer Schritt mit F8 )
|
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Also IOerror 104 bedeutet "Datei wurde nicht für Leseoperation geöffnet" ...
PS : Wenn die Variable "Zeile" ein String ist, dann sollte mit Zeile[n] eigentlich das n-te Zeichen des Strings extrahiert werde (ohne jeden Knall) - oder sehe ich das falsch? |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Also wenn es bei
Delphi-Quellcode:
ankommt,
if pos(chr(39),Zeile)=0 then begin // << zusätzlich
Überspringt es alles bis
Delphi-Quellcode:
springt hoch und "knallt" bei
CloseFile(Datei);
Delphi-Quellcode:
while not EoF(Datei) do
EDIT: Ich häng das Programm mal an. |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
So, der pstruh muss jetzt aus dem Büro nach Hause schwimmen! Ich denke, du suchst an der falschen Stelle. Die Fehlermeldung 104 sagt ja, dass die Datei gar nicht gelesen werden kann. Hier musst du erst einmal ansetzen. Bis später ... und viel Erfolg
|
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Wenn du die Daten eh schon in einem TMemo hast, wozu dann nochmals laden ?
So geht auch:
Delphi-Quellcode:
procedure TForm2.btLadenClick(Sender: TObject);
var ZeileIndex, SpalteIndex: integer; Zeile: string; i : integer; liste : TStrings; begin //Pfad zum Stammverzeichnis OpenDialog1.InitialDir:=ExtractFilePath(ParamStr(0)); if not opendialog1.Execute then exit; Memo1.Lines.LoadFromFile(OpenDialog1.FileName); liste := Memo1.lines; // Daten ins Stringgrid übertragen ZeileIndex:=1; for i:=0 to liste.count-1 do begin zeile := liste[i]; if (zeile<>'') and (zeile[1]='''') then continue; // Kommentarzeile überspringen //Tabelle automatisch um 1 Zeile erhöhen sgMess.RowCount:=sgMess.RowCount+1; SpalteIndex:=0; while pos(chr(9), Zeile) <> 0 do begin sgMess.Cells[SpalteIndex, ZeileIndex]:=copy(Zeile, 1, pos(chr(9), Zeile)-1); delete(Zeile, 1, pos(chr(9), Zeile)); inc(SpalteIndex); end; sgMess.Cells[SpalteIndex, ZeileIndex]:=Zeile; inc(ZeileIndex); end; end; |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Vielen Dank! Funktioniert einwandfrei :)
![]() ![]() Nun zum nächsten Problem...wie bekommen ich aus der Spalte mit den Werten, das Maximum und Minimum heraus? |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Hallo atgis,
deine Frage ist jetzt etwas verwunderlich, da die Lösung doch sehr einfach: In einer Schleife durchläufst du die GridSpalte mit den Werten. Vorher deklarierst du 2 Variablen MinVal:=maxInt und MaxVal:=0, wenn der Zellwert<MinVal ist, dann wird MinVal durch den Zellwert ersetzt, wenn Zellwert>MaxVal dann analog. Bist du in der letzten GridRow angekommen, stehen in beiden Variablen die gewünschten Werte. (Habe das jetzt bewusst nicht codiert), ich denke, es ist am lehrreichsten, wenn du das mit diesen Anweisungen selbst machst. Bin für weitere Hilfestellungen aber (naürlich) ansprechbar :hi: |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Danke!
Delphi-Quellcode:
So habe ich aber nur die Ergebnisse der ersten Spalte. Wie komme ich in die 2. Spalte mit den Werten?
var MinVal: integer;
MaxVal: integer; i: integer; begin MinVal:=maxInt; MaxVal:=0; for i:=1 to sgMess.RowCount-1 do if i < MinVal then MinVal:=i else if i > MaxVal then MaxVal:=i; edMin.Text:=IntToStr(MinVal); edMax.Text:=IntToStr(MaxVal); |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Hallo atgis,
joooo, das ist schon FAST die Lösung. Denkfehler dabei ist, dass du nur den Schleifenzähler untersuchst - du musst natürlich auf den Zellinhalt deiner Wertespalte prüfen (Werte stehen in Spalte 1, oder?)
Delphi-Quellcode:
Für den MaxWert analoges Vorgehen.
if StrToInt(sgMess.Cells[1,i])<MinVal then MinVal:=StrToInt(sgMess.Cells[1,i])
Gruß aus Hamburg |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Delphi-Quellcode:
Aber der Compiler spuckt mich schon bei
var MinVal: integer;
MaxVal: integer; i: integer; begin MinVal:=maxInt; MaxVal:=0; for i:=1 to sgMess.RowCount-1 do if StrToInt(sgMess.Cells[1,i]) < MinVal then MinVal:=StrToInt(sgMess.Cells[1,i]) else if StrToInt(sgMess.Cells[1,i]) > MaxVal then MaxVal:=StrToInt(sgMess.Cells[1,i]); edMin.Text:=IntToStr(MinVal); edMax.Text:=IntToStr(MaxVal);
Delphi-Quellcode:
an, dass der Wert 0019 kein gültiger Integerwert sei...Warum nicht? Ich wandel doch den String um? Es liegt aber nicht an 0019 - ich hab zum testen nur 19 hineingeschrieben!
StrToInt(sgMess.Cells[1,i])
![]() ![]() bei der Fehlermeldung "19 fehlt das andere "-Zeichen?! :shock: |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Hmmm, also da bin ich jetzt am Rätseln :evil: Das sollte eigentlich ohne Fehler funktionieren; da bin ich im Moment überfragt, sorry ...
|
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Ich habe das jetzt eben mal in einem Testprogramm durchgespielt, da hat es funktioniert - ich kann im Augenblick diese Fehlermeldung absolut nicht nachvollziehen. Ist es denn richtig, dass deine "Zahlenwerte" alle in der Spalte 1 enthalten sind?
|
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Ja die Werte stehen alle drin...so sieht es aus, wenn ich auf den Button Laden klick! Button1 soll das Maximum und Minimum in den Editfeldern ausgeben...
Da kommt aber eben der Fehler... Hier der Screenshot: ![]() ![]() EDIT: Ok! Ich hab den Fehler! Hinter den Werten z.b. "0019 " sind noch zwei Leerzeichen! Deswegen funktionierte die Umwandlung nicht! Kann man das irgendwie mit berücksichtigen, dass da 2 Leerzeichen sind? |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Tja, wat nu? Sind da unsichtbare Sonderzeichen im String? Prüfe doch mal, wie lang der String in der Zelle ist, ist er länger als 4 Zeichen (wenn 0019 zu sehen ist) dann wäre das ja ein Indiz ... Bin gespannt auf deine Antwort
|
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Über dir :-D
|
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Mit der Funktion trim bekommst Du überflüssige Leerzeichen weg.
|
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Muss das dann schon beim Laden, der TXT, in das StringGrid eingefügt werden?
EDIT:Hab es beim Laden mit eingefügt
Delphi-Quellcode:
Jetzt fehlt noch das 3. Problem :lol:! Wie kann ich den Mittelwert der Werte ermitteln? Ich muss mit einer Schleife erstmal alle Werte zusammen Zählen und dann durch die Anzahl (RowCount?) teilen?
while pos(chr(9), Zeile) <> 0 do
begin sgMess.Cells[SpalteIndex, ZeileIndex]:=trim(copy(Zeile, 1, pos(chr(9), Zeile)-1)); //geändert delete(Zeile, 1, pos(chr(9), Zeile)); inc(SpalteIndex); end; |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
IMHO müsste es beim Vergleichen genügen:
Delphi-Quellcode:
if StrToInt(trim(sgMess.Cells[1,i])) < MinVal then
MinVal:=StrToInt(trim(sgMess.Cells[1,i])) |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Zitat:
|
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Hallo atgis.
Prima! Wir kommen voran! :cheers: Ja, Mittelwert wie von dir formuliert. Eine zusätzliche Schleife wird nicht benötigt; summiere einfach schon in der vorhandenen Schleife zur Min/Max-Bestimmung. Gruß |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
So...ich hab aber noch ein Problem mit dem Datentyp!
Delphi-Quellcode:
Inkompatible Typen: "Integer" und "Extended"...
begin
summe:=0; for i:=1 to sgMess.RowCount-1 do summe:=StrToInt(sgMess.Cells[1,i])+summe; mittelwert:=summe/(sgMess.RowCount-1); edMittel.Text:=IntToStr(mittelwert); end; Wie wandle ich das (sgMess.RowCount-1); um, dass ich damit Rechnen kann? |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Wie ist mittelwert deklariert?
|
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Als integer...
|
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Ok ich habs... :oops: ...
Ich hab es als Single Deklariert...und das Ergebnis im Editfeld mit FloatToStr umgewandelt |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
So noch etwas...
ich muss noch eine Abweichung des Mittelwertes berechnen. Gegeben ist:
Delphi-Quellcode:
Aber leider kann ich damit nicht viel anfangen. Weiß jemand anderes was? Im Zusammenhang mit dem Arithmetische Mittel, kenn ich nur die mittlere Abweichung. Die wird aber anders berechnet... :roll:
//Abweichung ermitteln
Mittelwert:= _ _ _ _ _; AbweichungsQuadrat:=0; for i:= 1 to Anzahl do AbweichungsQuadrat:=AbweichungsQuadrat + (x[i] - Mittelwert) * (x[i] - Mittelwert); Standardabweichung:= SQRT(AbweichungsQuadrat/(Anzahl(Zahlenfeld) 1); |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Hallo atgis,
wo liegt das Problem? Ich kenne die Formel nicht. Aber es schaut doch so aus, dass dies schon die Umsetzung in Delphi ist. Die Werte x[i] musst du offenbar nur gegen die Zellwerte austauschen: x[i] wird also zu StrToInt(sgMess.Cells[1,i]) ... |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Ja genau...das hab ich mir auch schon gedacht :) . Ich habe bloß wieder Probleme, bei der Umsetzung. Ich schreib einfach mal meinen Stand:
Delphi-Quellcode:
So einfach ist es aber dann doch nicht! Es funktioniert so nämlich nicht. Schön wenn es jemand verbessern kann...
Mittelwert:= edMittel.text; //bzw summe / (sgMess.RowCount-1);
AbweichungsQuadrat:=0; for i:= 1 to sgMess.RowCount-1 do AbweichungsQuadrat:=AbweichungsQuadrat + (StrToInt(sgMess.Cells[1,i]) - Mittelwert) * (StrToInt(sgMess.Cells[1,i]) - Mittelwert); Standardabweichung:= SQRT(AbweichungsQuadrat/(sgMess.RowCount-1(Zahlenfeld) 1) //Zahlenfeld? ist das auch StrToInt(sgMess.Cells[1,i]? edAbw.text:=IntToStr(Standardabweichung); EDIT: hier hab ich schon den 1. Fehler
Delphi-Quellcode:
Integer und Extended sind inkompatibel...da Mittelwert Single ist...
AbweichungsQuadrat:=AbweichungsQuadrat + (StrToInt(sgMess.Cells[1,i]) - Mittelwert) * (StrToInt(sgMess.Cells[1,i]) - Mittelwert);
|
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Hallo atgis,
sorry, da habe ich nicht daran gedacht. Nähern wir uns der Lösung, kenne sie auch noch nicht :-( Verwenden wir statt StrToInt gleich StrToFoat, damit kommen wir einen Schritt weiter. Das Nächste: Der Divisor "Anzahl Zahlenfeld" wird vermutlich die Anzahl der Werte sein, in unserem Fall also RowCount-FixedRows. Sorgen macht mir im Augenblich die "einsam stehende 1" vor der letzten Klammer - die kann so nicht richtg sein. Da müssen wir mal in ein Mathebuch schauen.... (Übrigens, machen wir gerade irgend eine Hausaufgabe???) Gruß aus Hamburg edit1 : In meinem uralten "Handbuch der Mathematik" finde ich eine Formel die zu passen scheint: "Mittlerer Fehler der Einzelmessung bei gleicher Präzision der Einzelmessung" - demnach ist der Divisor "n-1" >> offenbar fehlt da also ein Minuszeichen. :nerd: |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
Mh...ich glaube mich erinnern zu können es ist diese Formel:
Standardabweichung (Die Standardabweichung ist in der Stochastik ein Maß für die Streuung der Werte einer Zufallsvariablen um ihren Mittelwert.) ![]() Danach war aber eben der Quelltext von oben gegeben?! Meinst du auch diese? :wink: |
Re: StringGrid - Minimum, Maximum, Durchschnitt bestimmen
So ich hab noch einwenig Probiert...
Delphi-Quellcode:
Ich erhalte aber wieder folgende Exception:
var //DCL Abweichung
AbweichungsQuadrat: single; Standardabweichung: single; begin //Abweichung ermitteln Mittelwert:= summe / (sgMess.RowCount-1); AbweichungsQuadrat:=0; for i:= 1 to sgMess.RowCount-1 do AbweichungsQuadrat:=AbweichungsQuadrat + (StrToFloat(sgMess.Cells[1,i]) - Mittelwert) * (StrToFloat(sgMess.Cells[1,i]) - Mittelwert); Standardabweichung:= SQRT((AbweichungsQuadrat)/(sgMess.RowCount-1)*(StrToFloat(sgMess.Cells[1,i])) -1); edAbw.text:=FloatToStr(Standardabweichung); end; ![]() ![]() Da in den Klammern nichts steht, wurde wohl auch noch gar kein Wert benutzt?! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:55 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