Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Worte zählen im Memo (https://www.delphipraxis.net/131346-worte-zaehlen-im-memo.html)

hansdieter11 23. Mär 2009 18:08


Worte zählen im Memo
 
Delphi-Quellcode:
var
  Form1: TForm1;
  ergebnis : Integer;

implementation

{$R *.DFM}

procedure TForm1.WorteInZeile(Sender: TObject);
var n : integer;
    WortEnde : boolean;
    nWorte : integer;

begin
  nWorte := 0;
  WortEnde := true;

  for n := 0 to length(memo1.lines(n)) do
    begin
      if (WortEnde = true) and (StrZeile[n] <> '')
      then
        begin
          WortEnde := false;
          nWorte := nWorte+1;
        end
      else
        if not WortEnde and (StrZeile[n] = '')
        then
          begin
            WortEnde := true;
          end;
      end;

    ergebnis := nWorte;
end;

procedure TForm1.Button1Click(Sender: TObject);
var n : integer;
    nWorte : integer;

begin
  for n := 0 to memo1.lines.count do
      begin
        nWorte := nWorte+WorteInZeile(memo1.lines[n]);
      end;

  button1.caption := inttostr(ergebnis);
end;

end.
Hallo zusammen,
ich habe ein Problem. Und zwar, wenn ich in einem Memo die Worte zählen möchte, dann meldet Delphi noch Fehler. Wäre nett, wenn mir jemand helfen könnte, möglichst schnell ;-)

Vielen Dank im Vorraus :)

Meflin 23. Mär 2009 18:12

Re: Worte zählen im Memo
 
WorteInZeile soll die Wörter in einer Zeile zählen. Du übergibst aber nirgends den Parameter, welche Zeile denn gezählt werden soll.

Außerdem solltest du das als function und nicht als procedure implementieren :roll:

Und drittens ist das:
Zitat:

dann meldet Delphi noch Fehler
keine Fehlerbeschreibung :roll:

hansdieter11 23. Mär 2009 18:25

Re: Worte zählen im Memo
 
Naiv gefragt, aber unser Leherer hat das so projeziert: Was genau muss ich tun, um dem WorteInZeile ein Parameter zuzuordnen?

Eine for-Schleife? Und function hatte er auch angeschrieben, aber nun will Delphi oben bei type hinter dem Doppelpunkt bei der

function noch irgendwas:
Zitat:

ein Bezeichner erwartet, aber PUBLIC gefunden
Was ist zu tun ? :o

Vielen Dank im Vorraus :)

Teekeks 23. Mär 2009 19:11

Re: Worte zählen im Memo
 
Den Teil in dem der Fehler ist hast du uns noch garnicht gezeigt ^^

BullsEye 23. Mär 2009 19:15

Re: Worte zählen im Memo
 
Evtl nen ; (Simikolon) vergessen?

Wäre aber Hilfreich, wenn du uns den Code mit dem Fehler zeigst ;)

bigben37 23. Mär 2009 19:18

Re: Worte zählen im Memo
 
Zitat:

Zitat von hansdieter11
Und function hatte er auch angeschrieben, aber nun will Delphi oben bei type hinter dem Doppelpunkt bei der function noch irgendwas

Ja, eine Funktion gibt etwas zurück und hinter dem Doppelpunkt muss noch der Typ des Rückgabewerts definiert werden.
Allgemeiner Aufbau einer Funktion:

Delphi-Quellcode:
function [Name] ([Param1]: [Typ Param1]; [Param2]: [Typ Param2]...): [Typ Rückgabewert];
begin
  //Code
end;
Edit2: Mein 100. Beitrag

Meflin 23. Mär 2009 19:23

Re: Worte zählen im Memo
 
Im übrigen hast du noch ganz andere Fehler drin: Deine Schleifen laufen alle 1 zu weit (du fängst bei Null zu zählen an, das letzte Element ist als n - 1 und nich n) und außerdem verwendest du die Variable n im selben Kontext für zwei verschiedene Sachen. Das kann nicht gutgehen.

hansdieter11 23. Mär 2009 19:39

Re: Worte zählen im Memo
 
Delphi-Quellcode:
var
  Form1: TForm1;
  ergebnis : Integer;

implementation

{$R *.DFM}

function TForm1.WorteInZeile(Sender: TObject): integer;
var n : integer;
    WortEnde : boolean;
    nWorte : integer;

begin
  nWorte := 0;
  WortEnde := true;

  for n := 0 to length(memo1.lines(n)) do //hier meckert Delphi: Operator oder Semikolon fehlt
    begin
      if WortEnde = true and (StrZeile[n] <> '') //hier meckert Delphi: Undifinierter Bezeichner: 'StrZeile'
      then //hier meckert Delphi: Operator ist auf diesem Operandentyp nicht anwendbar
        begin
          WortEnde := false;
          nWorte := nWorte+1;
        end
      else
        if not WortEnde and (StrZeile[n] = '')
        then //hier meckert Delphi: Operator ist auf diesem Operandentyp nicht anwendbar
          begin
            WortEnde := true;
          end;
      end;

    ergebnis := nWorte;
end;

procedure TForm1.Button1Click(Sender: TObject);
var n : integer;
    nWorte : integer;

begin
  for n := 0 to memo1.lines.count do
      begin
        nWorte := nWorte+WorteInZeile(memo1.lines[n]); //hier meckert Delphi: Inkompatible Typen: 'TObject' und 'String'
      end;

  button1.caption := inttostr(ergebnis);
end;

end.
Ich komme überhaupt nicht weiter. Wäre froh über direkte Verbesserung der Fehler, dann werde ich es sicher auch besser verstehen ;)

Vielen Dank im Vorraus :)

Meflin 23. Mär 2009 19:47

Re: Worte zählen im Memo
 
Delphi-Quellcode:
var
  Form1: TForm1;
  ergebnis : Integer;

implementation

{$R *.DFM}

function TForm1.WorteInZeile(Sender: TObject): integer;
var n : integer;
    WortEnde : boolean;
    nWorte : integer;

begin
  nWorte := 0;
  WortEnde := true;

  for n := 0 to length(memo1.lines(n)) do //hier meckert Delphi: Operator oder Semikolon fehlt
                                           // es muss auch lines[n] heißen, außerdem meinst du sicherlich NICHT das n das auch gleichzeitig Schleifenvariable ist
    begin
      if WortEnde = true and (StrZeile[n] <> '') //hier meckert Delphi: Undifinierter Bezeichner: 'StrZeile'
                                                  //Du hast StrZeile ja auch nirgends definiert!
      then //hier meckert Delphi: Operator ist auf diesem Operandentyp nicht anwendbar
        begin
          WortEnde := false;
          nWorte := nWorte+1;
        end
      else
        if not WortEnde and (StrZeile[n] = '')
        then //hier meckert Delphi: Operator ist auf diesem Operandentyp nicht anwendbar
              // StrZeile ist unbekannt und kann somit auch nicht verglichen werden
          begin
            WortEnde := true;
          end;
      end;

    ergebnis := nWorte;
end;

procedure TForm1.Button1Click(Sender: TObject);
var n : integer;
    nWorte : integer;

begin
  for n := 0 to memo1.lines.count do
      begin
        nWorte := nWorte+WorteInZeile(memo1.lines[n]); //hier meckert Delphi: Inkompatible Typen: 'TObject' und 'String'
                                                        //WorteInZeile erwartet als Parameter ein Objekt (Sender), du übergibst ihm einen string. Funktioniert halt nicht
      end;

  button1.caption := inttostr(ergebnis);
end;

end.

mkinzler 23. Mär 2009 19:47

Re: Worte zählen im Memo
 
function TForm1.WorteInZeile(str: string): integer;
Delphi-Quellcode:
for n := 1 to length( str) do
Delphi-Quellcode:
      if (WortEnde) and (StrZeile[n] <> '') //hier meckert Delphi: Undifinierter Bezeichner: 'StrZeile'
Was ist StrZeile? / Wo hast du das deklariert?
Delphi-Quellcode:
if (not WortEnde) and (StrZeile[n] = '')

SimStar001 23. Mär 2009 19:48

Re: Worte zählen im Memo
 
ganz ehrlich, ohen dir zu nahe treten zu wollen, aber dein Code ist totaler bullshit.

Dein Code:
Delphi-Quellcode:

//1. du hast hier eine Procedure, willst aber einen Wert, nämlich die Anzahl der Worte in der Zeile erhalten, also nimm
//   eine Function

// 2. du musst immer entweder einen String (Zeile), oder eben die Zeilennummer an die Function übergeben, das geschieht hier jedoch nicht.
procedure TForm1.WorteInZeile(Sender: TObject);
var n : integer;
    WortEnde : boolean;
    nWorte : integer;

begin
  nWorte := 0;
  WortEnde := true;

  // ganz grober Fehler: wenn du einen Zeilenindex übergibst, darf dieser nicht die Zählvariable sein also nimm zum Zählen was anderes, z.b. i
  for n := 0 to length(memo1.lines(n)) do
    begin
      if (WortEnde = true) and (StrZeile[n] <> '')
      then
        begin
          WortEnde := false;
          nWorte := nWorte+1;
        end
      else
        if not WortEnde and (StrZeile[n] = '')
        then
          begin
            WortEnde := true;
          end;
      end;

    ergebnis := nWorte;
end;

So die restliche Fehlersuche erspar ich mir, ich schreibe dir lieber gleich was richtiges:


Delphi-Quellcode:

function CountWordsInLine(LineText : string) : integer;
var position: integer;
begin
  result := 0;

  if LineText = '' then
    exit;

  repeat

  position := pos(' ',LineText);
  if position > 0 then
    begin
    LineText := copy(LineText,position + 1,length(LineText));
    inc(result);
    end
      else
        if length(LineText) > 0 then
          inc(result);
   
  until (position = 0);  
end;
Delphi-Quellcode:
//Aufruf der Function

var Woerter , i: integer;
.
.
.
Woerter := 0;
if Memo1.lines.count > 0 then
  for i := 0 to high(Memo1.lines) do
    Woerter := Woerter + CountWordsInLine(Memo1.lines[i]);

Meflin 23. Mär 2009 19:51

Re: Worte zählen im Memo
 
Zitat:

Zitat von SimStar001
So die restliche Fehlersuche erspar ich mir, ich schreibe dir lieber gleich was richtiges

Gratulation, und wiedermal wurde solange dumm nachgefragt, bis jemand die kopierfähige Lösung präsentiert :roll:

SimStar001 23. Mär 2009 19:59

Re: Worte zählen im Memo
 
Joah sorry, aber das war mir hier jetzt echt zu doof!

soll ers doch kopieren, verstehen tut ers wahrscheinlich eh net! Oder??? Kann ja meinen Code auch wieder löschen!?

hansdieter11 23. Mär 2009 20:28

Re: Worte zählen im Memo
 
Ja sorry, aber ich habs erhlicherweise auch nur von meinem Lehrer kopiert, um es zu Hause dann zu verstehen. Doch wie ihr merkt, ich verstehe es nicht. Vielen Dank für den geposteten Code. Er funktioniert einwandfrei und ich verstehe ihn so endlich auch ;)

SimStar001 23. Mär 2009 20:40

Re: Worte zählen im Memo
 
Kein ding, nur was war denn genau nun deine Aufgabe, bzw was behandelt ihr denn gerade im Unterricht!?

dsola 24. Mär 2009 07:31

Re: Worte zählen im Memo
 
Hi.
Maybe this helps.
Delphi-Quellcode:
unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm4 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

procedure TForm4.Button1Click(Sender: TObject);
var stList: TStringList;
    ss:string;
    WorteCount:integer;
    xx:integer;
begin
  stList := TStringList.Create;

  ss := Memo1.Text;
  ss:= StringReplace(ss,' ', #13#10, [rfReplaceAll]);

  stlist.Text := ss;
  WorteCount := stList.Count;

  ShowMessage('WorteCount is '+ IntToStr(WorteCount));

  FreeandNil(stList);
end;

end.

hansdieter11 24. Mär 2009 16:18

Re: Worte zählen im Memo
 
Aufgabe war, ein Programm zu schreiben, mit dem wir Wörter in einem Memo zählen können. Da ich die Version meines Lehrers nicht verstanden habe, wollte ich hier mal nachfragen. Heute haben wir function nochmal näher behandelt.
Viele Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz