Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi newbie probleme mit strings (https://www.delphipraxis.net/30217-newbie-probleme-mit-strings.html)

bmg4ever 22. Sep 2004 06:36


newbie probleme mit strings
 
hi leute

ich hab folgendes problem. ich nutze borland delphi 6 und habe einen button und ein editfeld (keine sorge ich bin noch nicht fertig sondern befinde mich in den ersten zügen und komm schon nicht weiter).
nun wollte ich mit folgendem quelltext auf druck des buttons gerne die position der innersten klammerauf haben.

Code:
procedure TForm1.Button1Click(Sender: TObject);

const klammern = ['(',')'];
var run, anzahlKA, posKA: integer;

begin
        run := 0;
        formel := Edit1.Text;

        anzahlKA := StrCharCount(formel, '(');


        while not anzahlKA = 0 do begin

                while not (formel[run] = '(') do inc(run);
                dec(anzahlKA);

        end;

//        posKA := run;
        EDit1.Text := IntToStr(run);


end;
angenommen im editfeld steht nun sowas wie "12345(7". dann sollte der run=6 sein, was er aber nicht ist. er behält immer den wert null.
wo ist mein fehler.

P.S: dec(var) ist doch richtig zum runterzählen?

bmg4ever 22. Sep 2004 06:57

Re: newbie probleme mit strings
 
Zitat:

Zitat von bmg4ever
Code:
        while not (anzahlKA = 0) do begin

                while not (formel[run] = '(') do inc(run);
                dec(anzahlKA);

        end;

ok sorry erst gucken dann posten :wall:
ich hab da ne klammer vergessen bei der bedingung und noch nen logikfehler drin. aber jetz ist mir klarf wie ich weiter machen muss

Sharky 22. Sep 2004 07:15

Re: newbie probleme mit strings
 
Hai bmg4ever,

ersteinmal: "Herzlich Willkommen in der Delphi-PRAXIS".

Ich habe gleich einen kleinen Tip für dich. Versuche möglichst immer Code der "etwas Macht" von Ereignissen der Benutzeroberfläche zu trennen. In deinem Falle würde ich also den Code nicht in das .OnClick des Buttons setzen sonder dafür eine eigene Funktion schreiben. Das hat den Vorteil das Du denn Code zum einen auch an andere Stelle verwenden kannst und Du keine "Probleme" bekommst wenn Du anstelle des Buttons das ganze z.B. über einen Menüpunkt machen möchtest.
Wenn ich das richtig verstanden habe möchtest Du also die Position des letzen ( im String ermitteln?

Hier mal ein Beispiel wie ich es gemacht hätte (was nicht heissen soll das es besser ist).
Delphi-Quellcode:
function KlammerPosition (value : String) : Integer;
var
  ndx : Integer; // Zählervariable für Schleife
  foo : Integer; // Hilfsvariable für Zählung
begin
  foo := 0; // Wenn keine Klammer gefunden
  for ndx := 1 to Length (value) do
  begin
    if (value[ndx] = '(') then foo := ndx;
  end;
  result := foo; // Ergebniss
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i : Integer;
begin
  i := KlammerPosition (Edit1.Text);
  if (i > 0) then
  begin
    ShowMessage ('Die letze "(" ist an Position ' + IntToStr (i));
  end
  else
  begin
    ShowMessage ('Keine "(" gefunden');
  end;
end;

NicoDE 22. Sep 2004 07:23

Re: newbie probleme mit strings
 
Man könnte auch LastDelimiter verwenden.

bmg4ever 22. Sep 2004 07:46

Re: newbie probleme mit strings
 
danke nico

das kommt auch noch in funktionen.
ich will, dass mein Taschenrechner jetzt auch klammern kann ;), aber ich befinde mich noch in der testphase der syntax, ob das überhaupt so funzt wie ich mir das vorstelle.
deshalb hab ich losgelöst von meinem bestehenden punkt-vor-strich calculator ein neues testprojekt anfgefangen, um mir nix im alten quelltext kaputt zu machen.

aber nimms mir nicht übel. zwecks übung werde ich es auch so machen wie ich mir das vorstelle, auch wenn das nicht die feinste "grammatik" ist. ;)
mittlerweile funzt es auch schon den inhalt der klammern nacheinander zu extrahieren.

bmg4ever 22. Sep 2004 09:37

Re: newbie probleme mit strings
 
so ich häng nun ziemlich am schluss des tests:

Code:
Insert(temp, ergebnis, (posOP1 + 1));
der hier lässt sich einfach nicht bewegen. die insert funktion wird nicht ausgeführt.
temp hat hier nach einer delete function in meinem test nur noch ein leerzeichen als inhalt.
ergebnis ist eine zahl als string.
und posOP1 ist 0.

all das stimmt. ich habs durch unabhängige ausgaben überprüft (ich ersticke schon fast in showmessages ;) )

warum insertet der nun immer nichts an der stelle 1. der string temp ist nachher genauso wie vorher.

Steve 22. Sep 2004 09:45

Re: newbie probleme mit strings
 
Zitat:

Zitat von Delphi-Hilfe
procedure Insert(Source: string; var S: string; Index: Integer);

Beschreibung
In Delphi fügt Insert Source in S an der Position S[Index] ein.

Das heißt, Du musst nur "temp" und "ergebnis" in deinem Prozeduraufrufvertauschen und fertig ;)

Gruß
Stephan

edit: Statt ShowMessage sollte Dir bei der Fehlersuche der Delphi-Referenz durchsuchenDebugger helfen :)

bmg4ever 22. Sep 2004 09:50

Re: newbie probleme mit strings
 
lol!

tausend dank steve.

wer lesen kann ist klar im vorteil. nochmal so ein schnellschuss. ist das peinlich. man merkt auch noch voll, dass ich ein newbie bin :-D
tschuldgigung für die zeit, die ich dir geraubt hab.

Christian Seehase 22. Sep 2004 15:21

Re: newbie probleme mit strings
 
Moin bmg4ever,

wenn ich Dich richtig verstanden habe, möchtest Du ja die innerste geöffnete Klammer haben.
Dazu würde ich mir die erste geschlosse suchen (z.B. mit pos), und anschliessend, von dieser Position ausgehend, nach links gehen, und die erste ( suchen.
Dann hättest Du genau die Positionen des innersten Klammerpaares.
(das setzt natürlich voraus, dass die Klammern immer paarweise auftreten, und korrekt gesetzt sind)

NicoDE 22. Sep 2004 15:27

Re: newbie probleme mit strings
 
Zitat:

Zitat von Christian Seehase
wenn ich Dich richtig verstanden habe, möchtest Du ja die innerste geöffnete Klammer haben.
Dazu würde ich mir die erste geschlosse suchen (z.B. mit pos), und anschliessend, von dieser Position ausgehend, nach links gehen, und die erste ( suchen.
Dann hättest Du genau die Positionen des innersten Klammerpaares.
(das setzt natürlich voraus, dass die Klammern immer paarweise auftreten, und korrekt gesetzt sind)

Letztendlich läuft es daurauf hinaus den String von Anfang bis zum Ende zu scannen und einen Baum aufzubauen (beim '(' einen Child anlegen und beim ')' zum Parent zurück - wenn der aktuelle Konten am Ende nicht Root ist oder beim Einlesen versucht wird den Parent von Root zu verwenden, ist der Ausdruck ungültig...).


Alle Zeitangaben in WEZ +1. Es ist jetzt 12: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