![]() |
Liste von Namen auf Charakteristiken überprüfen
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen, wiedermal habe ich ein Problem.
Es geht um folgendes: Ich soll ein Programm schreiben, bei dem eine Liste von Namen auf 2 Sachen überprüft werden sollen: a) ob sie mit einem/r ausgewählten Buchstaben/Buchstabenkombination beginnen b) ob kein genannter Buchstabe im Namen vorkommt Jene Namen die die ausgewählte Bedingung erfüllen, sollen dargestellt werden. Ich habe zu erst das Programm ohne die "Liste" geschrieben, sprich nur mit einem Namen, um zu überprüfen ob ich das mit den Bedingungen hinbekommen. Das hat 1A geklappt. Nun hänge ich jedoch an der "Liste". Ich habe die Variablen die von mehreren Objekten benutzt werden sollen unter "public" deklariert, da ich mir dadurch erhofft habe, sie würden global werden (was ja Pflicht sein sollte wenn mehrere Objekte drauf zugreifen sollen, oder?). Irgendetwas haut trotzdem nicht hin.
Delphi-Quellcode:
Wär nett wenn mir wieder wer helfen könnte. :)
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) RadioButton1: TRadioButton; RadioButton2: TRadioButton; edt_name: TEdit; Label1: TLabel; Button1: TButton; edt_start: TEdit; lbl_name: TLabel; lbl_letter: TLabel; procedure RadioButton1Click(Sender: TObject); procedure RadioButton2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } i:integer;name:array of string; end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.RadioButton1Click(Sender: TObject); var error:boolean; j,l:integer; word:string; begin for l:=1 to i do begin word:=name[l]; error:=false; for j:=1 to Length(word) do if edt_start.Text[j]<>word[j] then error:=true; if error=false then label1.Caption:=Label1.Caption + word else Label1.Caption:=label1.Caption + ''; end; end; procedure TForm1.RadioButton2Click(Sender: TObject); var error:boolean; j,k,l:integer; word:string; begin for l:=1 to i do begin word:=name[l]; error:=false; for j:=1 to Length(edt_start.Text) do for k:=1 to Length(word) do if edt_start.text[j]=word[k] then error:=true; if error=true then Label1.Caption:=Label1.Caption+'' else Label1.Caption:=Label1.Caption + word end; end; procedure TForm1.Button1Click(Sender: TObject); begin SetLength(name,(i+1)); name[i]:=edt_name.Text; inc(i); edt_name.text:=''; end; procedure TForm1.FormCreate(Sender: TObject); begin i:=1; end; end. |
AW: Liste von Namen auf Charakteristiken überprüfen
a) Pos() = 1
b) Pos() |
AW: Liste von Namen auf Charakteristiken überprüfen
Nur als Tips:
Mit High(Array) / Low(Array) kann man obere und untere Grenze eines Array ermitteln und dieses mit for i:=Low(Array) to High(Array) durchlaufen. Damit könntest du dir die Variable i sparen. Und der Vergleich if error=true / if error=false ist unschön und doppeltgemoppelt (und birgt auch eine Fehlerquelle, auch wenn ich die trotz der vielen Erklärungen die an dieser Stelle immer kommen, nicht verstanden habe). if error then reicht vollkommen bzw. if not error then. Liest sich doch auch schöner. Die Access Violation klingt danach, das auf ein nicht vorhandenen Array-Element zugegriffen wird. Ich glaube da du immer nach dem hinzufügen eines neuen Namens schon ein Inc(i) machst, bist du mit dem Zähler um eines zu hoch. |
AW: Liste von Namen auf Charakteristiken überprüfen
Zitat:
Delphi-Quellcode:
und
if Dings = true then
Delphi-Quellcode:
liegt darin, dass die erste Variante auf 1, die zweite aber auf <> 0 prüft. Von daher kann man also genausogut schreiben
if Dings then
Delphi-Quellcode:
, aber das sieht irgendwie *bäh* aus, oder nicht? ;)
if Dings <> false
|
AW: Liste von Namen auf Charakteristiken überprüfen
Genaugenomnmen ist False 0 und True <> 0. Das macht einen Vergleich auf True noch gefährlicher, da bei Delphi True 1 ist und bei (der) Windows (API) -1 ( Komplement). hat man nun ein False veiner Funktion der API und vergleicht diese gegen die Konstante kommt was Falsches raus. Deshalb sollte man nie auf True Prüfen!
|
AW: Liste von Namen auf Charakteristiken überprüfen
Die Access-Violation kommt, da nach dem SetLength(name, I+1) ein Inc(I) kommt. Der Array Index beginnt immer bei 0, daher ist ein Zugriff auf name[I] immer außerhalb der Arraygrenzen. Wenn du das Range-Checking eingeschaltet hättest, wäre die Fehlermeldung auch hilfreicher.
Unschön: Die Verwendung von "name", da TForm bereits ein Property "Name" hat, und "word" ist ein Datentyp. Die Delphi-Syntax lässt das zwar zu, aber es verwirrt eigentlich nur. Warum schreibst du nicht eine Prozedur, die ein einzelnes Wort überprüft, und diese fütterst du dann in einer Schleife mit den einzelnen Listenelementen? |
AW: Liste von Namen auf Charakteristiken überprüfen
Zitat:
|
AW: Liste von Namen auf Charakteristiken überprüfen
Ich habe dich ja nicht verbessert, sondern deine Ausführungen etwas vertieft.
|
AW: Liste von Namen auf Charakteristiken überprüfen
Wir können das am Freitag bei einem Bierchen ja vertiefen :lol:
|
AW: Liste von Namen auf Charakteristiken überprüfen
Das ist zuviel des Guten:
Delphi-Quellcode:
ich würde das verwenden:
for j:=1 to Length(word) do
if edt_start.Text[j]<>word[j] then error:=true;
Delphi-Quellcode:
und wort statt word, da word ein Typ ist.
error:=false;
j:=0; repeat inc(j,1); if if edt_start.Text[j]<>wort[j] then error:=true; until (j>=length(wort)) or error; Gruß K-H |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:01 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 by Thomas Breitkreuz