Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Schleifen-Problem (https://www.delphipraxis.net/103461-schleifen-problem.html)

Tommy1988 16. Nov 2007 00:10


Schleifen-Problem
 
Also, wie man meinem Projekt im Freewareforum (GaGaEditor) entnehmen kann,
arbeite ich dran, dass wenn man den Cursor z.B. irgentwo zwischen
(nicht ) hat, ein PopUpMenu mit allen dazu
gültigen Attributen erscheint.

Ich dachte ich könnt es so lösen:
Delphi-Quellcode:
procedure TForm1.Timer2Timer(Sender: TObject); // 2000 MS
var
aTag: String;
begin
while aTag <> '<a' do // nur ein tippfehler .. hat nix mit dem code zu tun =)
 begin
  aTag := Copy(SynMemo1.Text, CurPosition-1, 2);
  // CurPos.-1 = zurück gehen bis <a kommt und dann eine Teilstring von einer länge
  // von 2 zeichen kopieren
  Caption := aTag; // zum anlure, ob alles richtig ist (erstmal) als Caption ausgeben
 end;
end;
So.. Ich kann nicht sagen obs klappt (denke aber schon, müsste)
wenn da nicht ein Problem wäre:

Mein Programm HÄNGT wenn dieser Timer an ist ?!

cruiser 16. Nov 2007 00:29

Re: Schleifen-Problem (While)
 
Wenn du nur 2 Zeichen kopierst und gegen einen 3 zeichen langen String prüfst wird er nie etwas finden

Tommy1988 16. Nov 2007 00:35

Re: Schleifen-Problem (While)
 
habs folgender maßen probiert:

Delphi-Quellcode:
for i := CurPosition downto 0 do // ab CursorPosition bis Position 0 im Memo zählen
 begin
  while aTag <> '<a' do
   begin
    aTag := Copy(SynMemo1.Text, i-1, 2);
    Caption := aTag;
   end;
 end;
Da hängt er auch

cruiser 16. Nov 2007 00:53

Re: Schleifen-Problem (While)
 
Er muss hängen, weil du unter Umständen eine Endlosschleife damit baust

Versuchs mal so:

Delphi-Quellcode:
for i := CurPosition downto 1 do // ab CursorPosition bis Position 1 im Memo zählen
begin                           // 1 weil unten noch 1 abgezogen wird
  aTag := Copy(SynMemo1.Text, i-1, 2); // 2 Zeichen holen
  Caption := aTag; // debug
  if aTag = '<a' then break; // wenn gefunden, dann aussteigen
end;

Tommy1988 16. Nov 2007 01:02

Re: Schleifen-Problem (While)
 
Darf ich hier diesbezüglich noch eine andere Frage stellen?

Ich habe einen Hotkey registriert (einer geht)

2 nicht mehr:
Delphi-Quellcode:
procedure WmHotkey(var Msg: TMessage); message WM_HOTKEY;
procedure AttrHotKey(var Msg: TMessage); message WM_HOTKEY;
Kannst du da was zu sagen :oops:
"[Fehler] Unit1.pas(406): E2140 Doppelter Botschaftsmethoden-Index"

Sagt er nur ich weis nicht, wie ich sonst 2 HotKeys deklarieren sollte.

cruiser 16. Nov 2007 01:07

Re: Schleifen-Problem (While)
 
Ein Thread, eine Frage.

werte doch einfach msg innerhalb der procedure WMHotkey aus

Tommy1988 16. Nov 2007 01:30

Re: Schleifen-Problem (While)
 
Alsooo.. ich hab es jetzt vielleicht nicht SO elegant gelöst, aber es funktioniert super.

Was geschiet:
Zuerst wird nach "vorne" gesucht (1. Schleife), und zwar nach dem End-tag "</a>",
Delphi-Quellcode:
procedure TForm1.TBXItem79Click(Sender: TObject);
var
aTag, aEndTag: String;
i, x: Integer;
Point: TPoint;
begin
 // erst nach </a> suchen
  for x:= CurPosition+2 {+2 hinzugefügt} to Length(SynMemo1.Lines.Text) do
   begin
    aEndTag := Copy(SynMemo1.Text, x, 4);
     if aEndTag = '</a>' then
      begin
         for i := CurPosition-1 {-1 hinzugefügt}  downto 0 do
           begin
              aTag := Copy(SynMemo1.Text, i, 3);
               if aTag = '<a ' then
                begin
                  GetCaretPos(Point);
                  aLinkPopUp.Popup(Point.X+125, Point.Y+50);
                  break;
                end;
           end;
      end;
   end;
end;
{
Anmerkung zu den beiden in Klammern gesetzten Kommentaren:
OHNE den Zusatz -1, würde das Menu auch dann kommen, wenn der Cursor HINTER "a" (<Xa, da wo's X ist)
ist.
Ohne den Zusatz +1 würde das Menu auch dann kommen, wenn der Cursor zwischen [..]>und</a> wäre.
}
Über Verbesserungsvorschläge bezüglich des Codes wäre ich reichlich dankbar.

Tommy1988 16. Nov 2007 16:10

Re: Schleifen-Problem (While)
 
Ok, ein Problem ist trotzdem aufgetreten:

[....] ...
Edit

- Problem gelöst -

Tommy1988 16. Nov 2007 21:09

Re: Schleifen-Problem (While)
 
Folgendes Problem:
angenommen ich gebe folgenden html code ins memo ein:
<a href="">

aber lasse das </a> weg.

=> ich möchte gerne in DIESEM falle ab ">" bis zum nächsten "<" gehen. ist ein
"<" gefunden, soll hinter ">" ein "</a>" eingefügt werden.

Das klappt ja eigentlich auch, wenn es nicht nur so blöd wäre, dass immer weiter </a>'s hinzugefügt werden.

Delphi-Quellcode:
function SearchaEndTag(s: string): string;
var
  iPos, iNext: Integer;
begin
  iPos := 1;
  repeat
    iNext := PosEx('<a', s, iPos);
    if iNext = 0 then Break;
    iPos := PosEx('>', s, iNext);
    if iPos = 0 then Break;
    if Copy(s, Pred(iPos)+2, 4) <> '</a>' then
      Insert('</a>', s, iPos+1);
  until iPos > Length(s);
  Result := s;
end;
bei dem von mir angepassten code ist das problem, wenn hinter dem ">" irgentein buchstabe, also nicht ein "</a" kommt, ein "</a" hinzugefügt wird.

Ich habs schon mit schleifen versucht aber klappt leider nicht.

wie kann ich am dem ersten ">" (also das hier: <a href="">)
überprüfen, ob danach nicht irgentwo ein "</a>" kommt?
also dass eventuelle buchstaben nach dem ersten ">" ignoriert werden.

oder, dass alle nach dem ersten ">" eventuellen buchstaben ignoriert werden, bis zum
nächsten "<" vom neuen tag gesucht wird, und DANN das "</a>" eingefügt wird :gruebel:


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