![]() |
Logisches problem
:hi: Hallo
Hab gerade ein Problem und komm einfach nicht drauf. Und zwar bei meinen Abfragen hier unten. Mein Problem habe ich mit der Combobox4, wenn der Name in den Items vorhanden ist soll der eingebene Name nicht in die Items übernommen werden und es soll bei der 1. weitergehen und wenn der name nicht vorhanden ist soll er übernommen werden und es soll ebenfalls bei der 1.weitergehen Kann mir da mal jemand helfen habe gerade ein Denk Problen :stupid:
Delphi-Quellcode:
Danke saschaprocedure TForm7.Button2Click(Sender: TObject); var x,y:integer; begin if ComboBox4.Text <> '' then begin if ComboBox3.Items.IndexOf(ComboBox4.text)> -1 Then begin Application.MessageBox(' Vertretungsplan Existiert ','Speicherinformation',48); begin // bis hierhin funkioniert es wunderbar if not ComboBox4.Items.IndexOf(ComboBox4.Text)> -1 Then begin Combobox4.Items.Add(ComboBox4.Text); end; end else begin //1. Combobox3.Items.Add(ComboBox4.Text);// Text in die ComboBox3 List übergeben Vertrpl:= TStringlist.Create; // Stringliste erzeugen Vertrpl.Add(IntToStr(StringGrid1.Colcount)); Vertrpl.Add(IntToStr(StringGrid1.Rowcount)); for x:= 0 to StringGrid1.ColCount-1 do for y:= 0 to StringGrid1.RowCount-1 do Vertrpl.Add(StringGrid1.Cells[x,y]); for x:= 0 to StringGrid1.ColCount-1 do Vertrpl.Add(IntToStr(StringGrid1.ColWidths[x])); for x:= 0 to StringGrid1.RowCount-1 do Vertrpl.Add(IntToStr(StringGrid1.RowHeights[x])); Vertrpl.Add(IntToStr(StringGrid1.Clientwidth)); Vertrpl.Add(IntToStr(StringGrid1.Clientheight)); Vertrpl.Add(IntToStr(Ord(StringGrid1.ScrollBars))); plan:= ExtractFilePath(ParamStr(0))+'Vertretungspläne\'+ ComboBox4.Text +'.txt'; Vertrpl.SaveToFile(plan); Showmessage('Datei wurde in:' + sLineBreak + plan + ' gespeichert'); Vertrpl.Free; end; begin lehrerl:= ExtractFilePath(ParamStr(0)) +'\Lehrer Liste\'+ 'liste.txt'; ComboBox3.Items.SaveToFile(lehrerl); Form8.ListBox1.Clear; lehrerl2:= ExtractFilePath(ParamStr(0)) +'\Lehrer Liste\'+ 'alleLehrer.txt'; Combobox4.Items.SaveToFile(lehrerl2); lehrerl:= ExtractFilePath(ParamStr(0)) +'\Lehrer Liste\'+ 'liste.txt'; Form8.ListBox1.Items.LoadFromFile(lehrerl); Button7.click; end; end; end else Application.MessageBox('Bitte Name eingeben','Speicherinformation',48); end; |
Re: Logisches problem
Hallo Sascha,
ich weigere mich, so einen Quelltext zu untersuchen. Korrigiere doch bitte alle Einrückungen, sodass jedes begin am Anfang eines Teilstücks steht, der darin enthaltene Text exakt 2 Zeichen eingerückt ist und jedes end exakt unter dem dazugehörigen begin steht. Genauso sollten alle if-then-else sauber positioniert werden. Vielleicht fällt Dir dann ja selbst schon ein Fehler auf. Jürgen |
Re: Logisches problem
Zitat:
...wie wäre es damit die Komponenten richtig zu benennen ? |
Re: Logisches problem
Das End an Zeile 13 scheint überflüssig zu sein.
|
Re: Logisches problem
Delphi-Quellcode:
Was meinst du damit :gruebel:
wie wäre es damit die Komponenten richtig zu benennen ?
|
Re: Logisches problem
Zitat:
das eigentliche Problem ist kein Logisches! Sorry, aber ich glaube dein eigentliches Problem ist deine Code-Formatierung. Die solltest Du mal ganz dringend überdenken! Sehe ich das richtig, dass Du einzelne begin end; Blöcke verwendest, die nicht weiter zu einer Bedingung/Strucktur gehören? Warum? Dann solltest Du auch tunlichst die begins und ends korrekt einrücken. An sich solltest Du die 1. auch ruhig in eine eigene Prozedur auslagern. Erhöht einfach die Lesbarkeit! Ja, für die Lesbarkeit solltest Du immer Einiges tun! Gute Lesbarkeit hilft Fehler zu vermeiden und sollten doch welche drin sein, findest Du die leichter. Form7, Button2, ComboBox4, ... keine guten Namen. Versuche es mal so:
Delphi-Quellcode:
Ich hoffe Du siehst hier schon einen Fortschritt in der Lesbarkeit. Das ist aber nur ein Anfang! Du solltest wie gesagt noch mehr kleine Prozeduren (mit sprechendem Namen!) einführen, so dass man schnell siehst, was genau gemacht wird.
procedure TForm7.Button2Click(Sender: TObject);
var x,y:integer; begin if ComboBox4.Text <> '' then begin if ComboBox3.Items.IndexOf(ComboBox4.text)> -1 Then begin Application.MessageBox(' Vertretungsplan Existiert ','Speicherinformation',48); if not ComboBox4.Items.IndexOf(ComboBox4.Text) > -1 Then begin Combobox4.Items.Add(ComboBox4.Text); end; // if not ComboBox4.Items.IndexOf(ComboBox4.Text) > -1 //1. Combobox3.Items.Add(ComboBox4.Text);// Text in die ComboBox3 List übergeben Vertrpl:= TStringlist.Create; // Stringliste erzeugen Vertrpl.Add(IntToStr(StringGrid1.Colcount)); Vertrpl.Add(IntToStr(StringGrid1.Rowcount)); for x:= 0 to StringGrid1.ColCount-1 do begin for y:= 0 to StringGrid1.RowCount-1 do begin Vertrpl.Add(StringGrid1.Cells[x,y]); end; // for y:= 0 to StringGrid1.RowCount-1 Vertrpl.Add(IntToStr(StringGrid1.ColWidths[x])); Vertrpl.Add(IntToStr(StringGrid1.RowHeights[x])); end; // for x:= 0 to StringGrid1.ColCount-1 Vertrpl.Add(IntToStr(StringGrid1.Clientwidth)); Vertrpl.Add(IntToStr(StringGrid1.Clientheight)); Vertrpl.Add(IntToStr(Ord(StringGrid1.ScrollBars))); plan:= ExtractFilePath(ParamStr(0))+'Vertretungspläne\'+ ComboBox4.Text +'.txt'; Vertrpl.SaveToFile(plan); Showmessage('Datei wurde in:' + sLineBreak + plan + ' gespeichert'); Vertrpl.Free; lehrerl:= ExtractFilePath(ParamStr(0)) +'\Lehrer Liste\'+ 'liste.txt'; ComboBox3.Items.SaveToFile(lehrerl); Form8.ListBox1.Clear; lehrerl2:= ExtractFilePath(ParamStr(0)) +'\Lehrer Liste\'+ 'alleLehrer.txt'; Combobox4.Items.SaveToFile(lehrerl2); lehrerl:= ExtractFilePath(ParamStr(0)) +'\Lehrer Liste\'+ 'liste.txt'; Form8.ListBox1.Items.LoadFromFile(lehrerl); Button7.click; end; // if ComboBox3.Items.IndexOf(ComboBox4.text)> -1 end // if ComboBox4.Text <> '' else begin Application.MessageBox('Bitte Name eingeben','Speicherinformation',48); end; end; Gruß Der Unwissende [edit] Wo war der rote Kasten?! [/edit] |
Re: Logisches problem
Danke für diesen Tip.
Also muss euch mal sagen das ich es gut finde das ihr mir diese Tips gibt. daraus Kann man nur lernen. Aber das problem liegt einfach daran das ich: 1. Noch nicht so gut bin in Programmierung ( mach das erst seit 1 jahr) 2. Mir das nie richtig gezeigt wurde Deshalb bin ich froh über jeden Tip denn ich bekomme. mir ist das ja auchunangenehm. :oops: ich bitte euch etwas rücksicht zunehmen Danke Gruss Sascha P.S. man erkent einen Grossen Unterschied |
Re: Logisches problem
Hallo Sascha,
das hier sieht seltsam aus:
Delphi-Quellcode:
So wird ein Eintrag nur dann in die Liste aufgenommen, wenn er bereits in der Liste ist. Macht das Sinn?
// ...
if not ComboBox4.Items.IndexOf(ComboBox4.Text)> -1 Then begin Combobox4.Items.Add(ComboBox4.Text); end; // ... Um den Hinweis von Jürgen doch noch aufzugreifen: Programmieren ist soviel mehr als nur ein paar Komponenten auf eine Form zu ziehen und einen Quelltext ohne Fehlermeldungen zu übersetzen. Du wirst bereits nach einer Woche Urlaub deinen eigenen Quelltext nicht mehr verstehen, wenn du keine sinnvollen (sprechenden) Bezeichner verwendest - TForm1 und ähnliches sind Notlösungen, die von der IDE verwendet werden, weil sie es nicht besser weiß. Du aber kannst einen Button PrintButton nennen und eine Form MainForm oder so ähnlich. Solange du nur Zweizeiler postest wird sich niemand an einer fehlenden ![]() Freundliche Grüße PS: Bin ich ein Opfer der Zeitdilatation? Da wurden doch glatt fünf Beiträge eingestellt, während ich meinen Beitrag zurecht gefeilt habe... |
Re: Logisches problem
Was war damit gemeint
Zitat:
Zitat:
ja hätte es von Anfang an richtig beschreiben sollen. Aber ich glaube #6 ist auch nicht so ganz richtig aber es ist aufjedenfall lesbarer |
Re: Logisches problem
Hi Sascha...
Mir sind zwei sachen aufgefallen!
PS: Die Einrückung beeinflusst nicht die Exe ;) Also kann man einrück wie man will, solange es leserlich bleibt. Zitat:
Ich habe auch oft "if ... then begin" geschrieben, und das "end" auf Höhe von "if" geschrieben ;) PS: Es stimmt schon dass der Code sehr unleserlich ist ^^ Zitat:
Zitat:
[edit]Wenn ich es richtig verstanden habe, dann überprüft ob "IndexOf(ComboBox4.Text)" "-1" ist. Wenn es so ist, dann kannst du das machen, was gemacht werden soll, wenn ein Eintrag nicht existiert. Ansonsten das andere ausführen ^^[/edit] |
Re: Logisches problem
Wenn
ComboBox4.Items.IndexOf(ComboBox4.Text) = 1 Then dann den Rest ausfüren, ansonsten Combobox4.Items.Add(ComboBox4.Text); und dann erst den Rest ausfüren. Danke nochmal für die Tips :thumb: |
Re: Logisches problem
Zitat:
überprüfe einfach ob es <> -1 ist |
Re: Logisches problem
Hallo Sascha,
Zitat:
Delphi-Quellcode:
In Fabians Code aus Beitrag #10 ist der Fehler nicht enthalten.
for x:= 0 to StringGrid1.ColCount-1 do
begin for y:= 0 to StringGrid1.RowCount-1 do begin Vertrpl.Add(StringGrid1.Cells[x,y]); end; // Vertrpl.Add(IntToStr(StringGrid1.ColWidths[x])); // diese Zeile löschen // Vertrpl.Add(IntToStr(StringGrid1.RowHeights[x])); // diese Zeile löschen end; for x:= 0 to StringGrid1.ColCount-1 do // diese Zeilen einfügen Vertrpl.Add(IntToStr(StringGrid1.ColWidths[x])); // (von _x_ abhängig!) for y:= 0 to StringGrid1.RowCount-1 do // diese Zeilen einfügen Vertrpl.Add(IntToStr(StringGrid1.RowHeights[y])); // (von _y_ abhängig!) //Edit: auch die x-Schleife muß raus, sonst stimmt die Reihenfolge nicht! Gruß Hawkeye |
Re: Logisches problem
:pale: :gruebel: :wiejetzt:
Ich glaub jetzt bin ich total verwirt |
Re: Logisches problem
Sorry für die Verwirrung, ich versuche das mal zu erklären.
Das war dein Originalcode:
Delphi-Quellcode:
Du speicherst zunächst alle Zellen des Stringgrids ab, danach alle Spaltenbreiten und dann alle Zeilenhöhen.
for x:= 0 to StringGrid1.ColCount-1 do
for y:= 0 to StringGrid1.RowCount-1 do Vertrpl.Add(StringGrid1.Cells[x,y]); for x:= 0 to StringGrid1.ColCount-1 do Vertrpl.Add(IntToStr(StringGrid1.ColWidths[x])); for x:= 0 to StringGrid1.RowCount-1 do Vertrpl.Add(IntToStr(StringGrid1.RowHeights[x])); Bei Formatieren deines Codes wurde folgendes daraus (Beitrag #6):
Delphi-Quellcode:
Fehler 1: Es werden nun nicht mehr RowCount Zeilenhöhen gespeichert sondern ColCount.
for x:= 0 to StringGrid1.ColCount-1 do
begin for y:= 0 to StringGrid1.RowCount-1 do begin Vertrpl.Add(StringGrid1.Cells[x,y]); end; // for y:= 0 to StringGrid1.RowCount-1 Vertrpl.Add(IntToStr(StringGrid1.ColWidths[x])); Vertrpl.Add(IntToStr(StringGrid1.RowHeights[x])); end; // for x:= 0 to StringGrid1.ColCount-1 Fehler 2: Durch das Verlagern in die x-Schleife werden die Spaltenbreiten und Zeilenhöhen in die Zellendaten eingestreut. Nachdem jeder Spalte des Stringgrids folgt eine Spaltenbreite und darauf eine Zeilenhöhe. In meinem Beitrag #13 habe ich versucht, das zu korrigieren. Aber wie das mit der 13 so ist, ich habe einen Fehler übersehen und später meinen eigenen Beitrag überarbeitet. Fabian hat in Beitrag #10 deinen Code ebenfalls formatiert aber dabei die Schleifenstruktur nicht geändert. Deshalb hat sich dort der Fehler nicht eingeschlichen. Sind nun alle Klarheiten beseitigt? Gruß Hawkeye |
Re: Logisches problem
Naja das war ja vorher nicht das Problem das Speichern hat gut Funktioniert.
Das Problem war die Abfrage am Anfang, was immernoch nicht funkioniert. Ich ja ich habe mich selber total verwirt :stupid: :lol: |
Re: Logisches problem
Delphi-Quellcode:
Vielleicht so?if not ComboBox4.Items.IndexOf(ComboBox4.Text)> -1 Then begin Combobox4.Items.Add(ComboBox4.Text); end; end
Delphi-Quellcode:
oder so:
if ComboBox4.Items.IndexOf(ComboBox4.Text) <= -1 Then
begin Combobox4.Items.Add(ComboBox4.Text); end;
Delphi-Quellcode:
if not (ComboBox4.Items.IndexOf(ComboBox4.Text) > -1) Then
begin Combobox4.Items.Add(ComboBox4.Text); end; Grüße Klaus |
Re: Logisches problem
Hi...
Vielleicht ganz ersichtlich: Deiner:
Delphi-Quellcode:
Pseudocode:if not ComboBox4.Items.IndexOf(ComboBox4.Text)> -1 Then begin Combobox4.Items.Add(ComboBox4.Text); end;
Code:
Und das jetzt zu Delphi:
falls Position In Den Items Der ComboBox4 "nicht vorhanden" ist dann
Füge Item mit dem Text der ComboBox4 hinzu
Delphi-Quellcode:
if ComboBox4.Items.IndexOf(ComboBox4.Text) = -1 then // Wenn ".IndexOf" "-1" ergibt, dann ist der Eintrag nicht vorhanden begin Combobox4.Items.Add(ComboBox4.Text); // Füge ein Item hinzu (Hinweis: Wenn du es machst, während man den Text ändert, dann erstellt er ständig neue Einträge) end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:15 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