![]() |
Delphi-Version: 5
Procedure in Procedure aufrufen klappt nicht
Hallo mal wieder...Neues Programm neues Problem
Ich möchte gerne einen Text öffnen mit Opendialog --> das klappt. Dann möchte ich diesen Auf ein Wort durchsuchen was ich im editfeld eingebe klappt auch Jetzt soll das ganze aber mit einer extra procedure laufen das klappt nicht. Es gibt immer einen Fehler mit der Zeile wo ich die Procedure aufrufen möchte mit dem jeweiligen 's' Mir fällt aber keine Lösung mehr ein
Delphi-Quellcode:
implementation
{$R *.lfm} { TForm1 } procedure String_Zaehler(VAR s:string;position:integer); begin position:=pos('edit1.text',s); end; procedure TForm1.Button1Click(Sender: TObject); var posi: integer; dateiname,s: string; datei:textfile; //position: integer; begin if opendialog1.execute then begin dateiname:=opendialog1.filename; showmessage(dateiname); ASSIGNFILE(datei,dateiname); RESET(datei); while not eof(datei) do begin Readln(datei,s); String_Zaehler(s); label2.caption:=inttostr(position); showmessage('Zeile: '+s); end; end; Closefile(datei); end; end. |
AW: Procedure in Procedure aufrufen klappt nicht
Bei String_Zaehler muß das var vor position und die Procedere hat 2 Parameter.
|
AW: Procedure in Procedure aufrufen klappt nicht
mhh was meinst du mit Parameter?
ich hab das jetzt so procedure String_Zaehler(s:string;VAR position:integer); aber das geht auch nicht |
AW: Procedure in Procedure aufrufen klappt nicht
jenau, und jetzt noch String_Zaehler(s, position); aufrufen :thumb:
|
AW: Procedure in Procedure aufrufen klappt nicht
klappt nicht jetzt kommen ganz viele neue fehler ?
|
AW: Procedure in Procedure aufrufen klappt nicht
Delphi-Quellcode:
procedure String_Zaehler(s:string; var position:integer); // <-- da
begin position:=pos('edit1.text',s); end; procedure TForm1.Button1Click(Sender: TObject); var posi: integer; dateiname,s: string; datei:textfile; position: integer; // <-- da begin if opendialog1.execute then begin dateiname:=opendialog1.filename; showmessage(dateiname); ASSIGNFILE(datei,dateiname); RESET(datei); while not eof(datei) do begin Readln(datei,s); String_Zaehler(s, position ); // <-- da label2.caption:=inttostr(position); showmessage('Zeile: '+s); end; end; Closefile(datei); end; |
AW: Procedure in Procedure aufrufen klappt nicht
Ich hab das jetzt so und jetzt kommt wieder "Error Duplicate identifier"Position".
was ist denn falsch?
Delphi-Quellcode:
implementation
{$R *.lfm} { TForm1 } procedure String_Zaehler(s:string;var position:integer); begin position:=pos('edit1.text',s); end; procedure zeichenanhaengen(VAR s:string); begin end; procedure TForm1.Button1Click(Sender: TObject); var posi: integer; dateiname,s: string; datei:textfile; position:integer; begin if opendialog1.execute then begin dateiname:=opendialog1.filename; showmessage(dateiname); ASSIGNFILE(datei,dateiname); RESET(datei); while not eof(datei) do begin Readln(datei,s); String_Zaehler(s,position); label2.caption:=inttostr(position); end; end; Closefile(datei); end; |
AW: Procedure in Procedure aufrufen klappt nicht
Häng doch mal das gesamte Project als Anhang dran ...
|
AW: Procedure in Procedure aufrufen klappt nicht
Delphi-Quellcode:
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls; type { TForm1 } TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Label1: TLabel; Label2: TLabel; OpenDialog1: TOpenDialog; procedure Button1Click(Sender: TObject); procedure Label2Click(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; implementation {$R *.lfm} { TForm1 } procedure String_Zaehler(s:string;var position:integer); begin position:=pos('edit1.text',s); end; procedure zeichenanhaengen(VAR s:string); begin end; procedure TForm1.Button1Click(Sender: TObject); var posi: integer; dateiname,s: string; datei:textfile; position:integer; begin if opendialog1.execute then begin dateiname:=opendialog1.filename; showmessage(dateiname); ASSIGNFILE(datei,dateiname); RESET(datei); while not eof(datei) do begin Readln(datei,s); String_Zaehler(s,position); label2.caption:=inttostr(position); end; end; Closefile(datei); end; procedure TForm1.Label2Click(Sender: TObject); begin end; end. |
AW: Procedure in Procedure aufrufen klappt nicht
Du hast da wohl irgendwo etwas mit
Delphi-Quellcode:
benannt und das knallt jetzt.
Position
Versuch das einmal
Delphi-Quellcode:
implementation
{$R *.lfm} { TForm1 } procedure String_Zaehler(const AStr : String; var APosition : Integer ); begin APosition := Pos( 'edit1.text', AStr ); end; procedure zeichenanhaengen( var AStr : String ); begin end; procedure TForm1.Button1Click( Sender: TObject ); var LPosi : Integer; LDateiname, LS : String; LDatei : Textfile; LPosition : Integer; begin if OpenDialog1.Execute then begin LDateiname := OpenDialog1.Filename; ShowMessage( LDateiname ); AssignFile( LDatei, LDateiname ); Reset( LDatei ); while not Eof( LDatei ) do begin Readln( LDatei, LS ); String_Zaehler( LS, LPosition ); Label2.Caption := IntToStr( LPosition ); end; end; CloseFile( LDatei ); end; |
AW: Procedure in Procedure aufrufen klappt nicht
jetzt kommt das
unit1.pas(63,38) Hint: Local variable "Lposition1" does not seem to be initialized unit1.pas(64,44) Error: Identifier not found "LPosition" unit1.pas(67,19) Error: Identifier not found "datei" unit1.pas(77) Fatal: There were 2 errors compiling module, stopping |
AW: Procedure in Procedure aufrufen klappt nicht
Zitat:
|
AW: Procedure in Procedure aufrufen klappt nicht
ja ich ändere das programm nach den vorschlägen
|
AW: Procedure in Procedure aufrufen klappt nicht
Zitat:
|
AW: Procedure in Procedure aufrufen klappt nicht
mhh ich hab das jetzt kopiert jetzt kommen keine Fehler mehr.
Das verstehe ich nicht ?? Aber das Programm zeigt mir jetzt nicht an anwelcher Position der Wert aus dem Editfeld steht? |
AW: Procedure in Procedure aufrufen klappt nicht
Zitat:
Zitat:
Ich sehe das nicht ... und dein Compiler sieht das so wie ich ... |
AW: Procedure in Procedure aufrufen klappt nicht
ich hab da doch stehen label2.caption Lposition
da würde ich erwarten das dort die Position dann angezeigt wird? |
AW: Procedure in Procedure aufrufen klappt nicht
Das würde ich auch so sehen. Die Stelle, wo das ausgegeben werden soll, heißt im Original
Zitat:
|
AW: Procedure in Procedure aufrufen klappt nicht
Zitat:
nichts, bunte Farben, irgendwelche Zeichen? |
AW: Procedure in Procedure aufrufen klappt nicht
Zitat:
Delphi-Quellcode:
bzw.
position
Delphi-Quellcode:
befindet als String in das Label geschrieben wird - und ob man es glaubt oder nicht, genau das passiert, und zwar ganz genau das.
LPosition
UPDATE: Kleiner Tip von mir, ich wette das dort im Label
Delphi-Quellcode:
steht.
0
|
AW: Procedure in Procedure aufrufen klappt nicht
ja tut es auch aber ich kann es nicht nachvollziehen wieso
|
AW: Procedure in Procedure aufrufen klappt nicht
Unabhängig des Problems, eine Zwischenfrage - hat es einen Grund wieso du die Textdatei über ASSIGNFILE öffnest? Mit modernen Delphi mitteln wäre das um einiges einfacher.
|
AW: Procedure in Procedure aufrufen klappt nicht
Schreiben Sie eine Procedure, die einen Text nach einem String durchsucht und die Anzahl über eine
Referenzvariable ausgibt.(Procedure String_Zaehler(VAR T:Textfile; s:string, VAR Anz: Integer)). Schreiben Sie auch das Rahmenprogramm dazu in dem der Text über ein opendialog ausgewählt wird. Der der zu suchende String wird über ein Editfeld eingegeben und die Anzahl in einem Label ausgegeben. das ist die aufgabe |
AW: Procedure in Procedure aufrufen klappt nicht
Zitat:
|
AW: Procedure in Procedure aufrufen klappt nicht
in der Procedure String_Zaehler mit position:=pos('edit1.text',s)
und das s kommt aus dem Readln aus dem Button |
AW: Procedure in Procedure aufrufen klappt nicht
Zitat:
Delphi-Quellcode:
in dem String
'edit1.text'
Delphi-Quellcode:
zurück.
s
Wenn du auf den Wert des Edit-Feldes zugreifen möchtest, dann so
Delphi-Quellcode:
Alles was du in Anführungszeichen setzt ist ein String.
Edit1.Text
Delphi-Quellcode:
position := pos( 'ich bin ein konstanter string im Quelltext', s )
|
AW: Procedure in Procedure aufrufen klappt nicht
Zitat:
Deine
Delphi-Quellcode:
und so soll die laut Aufgabe aussehen
procedure String_Zaehler(const AStr : String; var APosition : Integer );
begin ... end;
Delphi-Quellcode:
:gruebel:
procedure String_Zaehler( var T : Textfile; s : string; var Anz : Integer );
begin ... end; UPDATE Ich kann ja mal von Lehrerisch auf Deutsch übersetzen ;)
Delphi-Quellcode:
und das geforderte Rahmenprogramm hast du ja schon fertig, darum baue ich dir diese Procedure da mal ein:
procedure String_Zaehler(
var T : Textfile; // Datei, in der gesucht werden soll (als Textfile-Referenz) s : string; // Suchtext var Anz : Integer // Anzahl der gefundenen Stellen ); begin ... end;
Delphi-Quellcode:
procedure TForm1.Button1Click( Sender: TObject );
var LDateiname : String; LDatei : Textfile; LAnzahl : Integer; begin if OpenDialog1.Execute then begin LDateiname := OpenDialog1.Filename; AssignFile( LDatei, LDateiname ); Reset( LDatei ); LAnzahl := 0; String_Zaehler( LDatei, Edit1.Text, LAnzahl ); Label2.Caption := IntToStr( LAnzahl ); end; CloseFile( LDatei ); end; |
AW: Procedure in Procedure aufrufen klappt nicht
weil ich so bisher noch gar nix hinbekommen habe und jetzt so stückchen für stückchen auf diese procedur hinarbeiten wollte
und als ich am anfang die '' nicht hatte gabs immer den Fehler: unit1.pas(42,24) Error: Identifier not found "edit1" unit1.pas(78) Fatal: There were 1 errors compiling module, stopping und danch nicht mehr |
AW: Procedure in Procedure aufrufen klappt nicht
Zitat:
Zitat:
|
AW: Procedure in Procedure aufrufen klappt nicht
Zitat:
|
AW: Procedure in Procedure aufrufen klappt nicht
Zitat:
|
AW: Procedure in Procedure aufrufen klappt nicht
so sieht das jetzt alles aus
Delphi-Quellcode:
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls; type { TForm1 } TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Label1: TLabel; Label2: TLabel; OpenDialog1: TOpenDialog; procedure Button1Click(Sender: TObject); procedure Edit1Change(Sender: TObject); procedure Label2Click(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; Zeile,Zeilen:string; position:integer; implementation {$R *.lfm} { TForm1 } procedure String_Zaehler(var text:string); procedure String_Zaehler( var T : Textfile; // Datei, in der gesucht werden soll (als Textfile-Referenz) s : string; // Suchtext var Anz : Integer // Anzahl der gefundenen Stellen ); var position,laenge:integer; begin Readln(Ldatei,s); Position:=pos(Edit1.Text,s); laenge:=LENGTH(edit1.text); delete(s,position,laenge); inc(ANZ); end; procedure TForm1.Button1Click(Sender: TObject); var LDateiname : String; LDatei : Textfile; LAnzahl : Integer; begin if OpenDialog1.Execute then begin LDateiname := OpenDialog1.Filename; AssignFile( LDatei, LDateiname ); Reset( LDatei ); LAnzahl := 0; String_Zaehler( LDatei, Edit1.Text, LAnzahl ); Label2.Caption := IntToStr( LAnzahl ); end; CloseFile( LDatei ); end; procedure TForm1.Edit1Change(Sender: TObject); begin end; procedure TForm1.Label2Click(Sender: TObject); begin end; end. |
AW: Procedure in Procedure aufrufen klappt nicht
und diese meldungen gibts nun
unit1.pas(50,19) Error: Identifier not found "Ldatei" unit1.pas(51,25) Error: Identifier not found "Edit1" unit1.pas(52,26) Error: Identifier not found "edit1" unit1.pas(60,17) Fatal: Syntax error, ";" expected but "." found |
AW: Procedure in Procedure aufrufen klappt nicht
Fehlerquelle :
Zitat:
LDatei : Textfile; ist nicht in der Prozedur deklariert, in der diese Variable benutzt wird. Der benutzte Übergabeparameter ist "T", also muß dort "T" statt LDatei benutzt werden = Readln(T,s); Edit1 ist unbekannt, weil die Prozedur "String_Zaehler" nicht als zu TForm1 gehörende, sondern eigenständig deklariert wurde. Mögliche Abhilfen : Vor den Variablennamen "Form1." schreiben ODER die Prozedur TForm1 zuordnen ODER die Prozedur innerhalb von Button1Click als lokale Unterprozedur einsetzen. |
AW: Procedure in Procedure aufrufen klappt nicht
yop hab ich gesehen aber die selben fehler
So jetzt klappts |
AW: Procedure in Procedure aufrufen klappt nicht
:)
So sieht der Quelltext nun aus Hab ich das richtig erkannt das wenn ich eine procedure aufrufe ...procedure(X,Y,Z); Das X,Y,Z die Variablen aus der procedure(VAR 1;2;3) wieder gibt in der selben Reihenfolge? Und man die Variablen nicht mit dem selben Namen bezeichnen darf?
Delphi-Quellcode:
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls; type { TForm1 } TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Label1: TLabel; Label2: TLabel; OpenDialog1: TOpenDialog; procedure Button1Click(Sender: TObject); procedure Edit1Change(Sender: TObject); procedure Label2Click(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; Zeile,Zeilen:string; position:integer; implementation {$R *.lfm} { TForm1 } procedure String_Zaehler( var T : Textfile; // Datei, in der gesucht werden soll (als Textfile-Referenz) s : string; // Suchtext var Anz : Integer // Anzahl der gefundenen Stellen ); var position,laenge:integer; text:string; begin while not eof(T) do begin Readln(T,Text); //lesen aus T(Tist LDatei) und in Text zwischen speichern Position:=pos(s,Text); //Position von s(Eingabe aus Edit1.text)in Text bestimmen laenge:=LENGTH(s); //Länge von dem Wort anzeigen delete(Text,position,laenge); //Wort löschen (aus Text) an Position des Ersten Bustabens //mit der länge(aus laenge); inc(ANZ); //ANZ hochzählen end; end; procedure TForm1.Button1Click(Sender: TObject); var LDateiname : String; LDatei : Textfile; LAnzahl : Integer; begin if OpenDialog1.Execute then begin LDateiname := OpenDialog1.Filename; AssignFile( LDatei, LDateiname ); Reset( LDatei ); LAnzahl := 0; String_Zaehler( LDatei, Edit1.Text, LAnzahl ); Label2.Caption := IntToStr( LAnzahl ); end; CloseFile( LDatei ); end; procedure TForm1.Edit1Change(Sender: TObject); begin end; procedure TForm1.Label2Click(Sender: TObject); begin end; end. |
AW: Procedure in Procedure aufrufen klappt nicht
Eigentlich können die Variablennamen bei Übergabeparametern gleich sein, wenn sie eben nicht doppelt deklariert werden. Und vor allem müssen sie an den richtigen Stellen benutzt werden. Aber Du hast es ja nun hinbekommen. Ich klinke mich also aus.
|
AW: Procedure in Procedure aufrufen klappt nicht
Eigentlich kein Fehler, aber ich würde statt
Delphi-Quellcode:
den Punkt so lösen
procedure TForm1.Button1Click(Sender: TObject);
... LAnzahl := 0;
Delphi-Quellcode:
Die Lösung von dir klappt zwar auch, aber da muss man vor der Nutzung der Prozedur zuerst die Variable löschen. Und das ist eine mögliche Fehlerquelle für die Zukunft. Und so erledigt man das Problem gleich in der Prozedur mit.
procedure String_Zaehler(
var T : Textfile; // Datei, in der gesucht werden soll (als Textfile-Referenz) s : string; // Suchtext var Anz : Integer // Anzahl der gefundenen Stellen ); var position,laenge:integer; text:string; begin Anz := 0; //<<< HIER auf Null setzten <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< while not eof(T) do |
AW: Procedure in Procedure aufrufen klappt nicht
@EMS
Du hast jetzt ein Programm, was die Anzahl der Textzeilen in einer Datei ermittelt. Die Anzahl der Vorkommnisse des Such-Strings in der Datei bekommst du so nicht. @Popov Da die procedure die Anzahl als
Delphi-Quellcode:
Parameter übergeben bekommt, muss die Variable vorher initialisiert werden.
var
Die genauen Anforderungen kennen wir nicht. Evtl. soll diese procedure (in den nächsten Schritten) auch mehrfach aufgerufen werden (mehrere Dateien) und die Anzahl soll immer weiter erhöht werden. Wenn wirklich nur die Anzahl zurückgegeben werden soll, dann wäre Anzahl in der Vorgabe ein
Delphi-Quellcode:
Parameter gewesen ;)
out
(gut, kann auch sein, dass der Lehrer diesen feinen Unterschied gar nicht kennt) |
AW: Procedure in Procedure aufrufen klappt nicht
hallo
doch ich habe einfach in die Text datei nen paar mal das Wort "Test" zegefügt und dann passte die Anzahl wie oft das Wort "Test" in meiner Textdatei vorkommt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:22 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