![]() |
Schleifen-Problem
Also, wie man meinem Projekt im Freewareforum (GaGaEditor) entnehmen kann,
arbeite ich dran, dass wenn man den Cursor z.B. irgentwo zwischen ![]() gültigen Attributen erscheint. Ich dachte ich könnt es so lösen:
Delphi-Quellcode:
So.. Ich kann nicht sagen obs klappt (denke aber schon, müsste)
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; wenn da nicht ein Problem wäre: Mein Programm HÄNGT wenn dieser Timer an ist ?! |
Re: Schleifen-Problem (While)
Wenn du nur 2 Zeichen kopierst und gegen einen 3 zeichen langen String prüfst wird er nie etwas finden
|
Re: Schleifen-Problem (While)
habs folgender maßen probiert:
Delphi-Quellcode:
Da hängt er auch
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; |
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; |
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:
Kannst du da was zu sagen :oops:
procedure WmHotkey(var Msg: TMessage); message WM_HOTKEY;
procedure AttrHotKey(var Msg: TMessage); message WM_HOTKEY; "[Fehler] Unit1.pas(406): E2140 Doppelter Botschaftsmethoden-Index" Sagt er nur ich weis nicht, wie ich sonst 2 HotKeys deklarieren sollte. |
Re: Schleifen-Problem (While)
Ein Thread, eine Frage.
werte doch einfach msg innerhalb der procedure WMHotkey aus |
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:
Über Verbesserungsvorschläge bezüglich des Codes wäre ich reichlich dankbar.
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. } |
Re: Schleifen-Problem (While)
Ok, ein Problem ist trotzdem aufgetreten:
[....] ... Edit - Problem gelöst - |
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:
bei dem von mir angepassten code ist das problem, wenn hinter dem ">" irgentein buchstabe, also nicht ein "</a" kommt, ein "</a" hinzugefügt wird.
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; 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