Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - BBCode ähnliches Shorttags abfragen?


SunnyDream - So 04.06.06 11:32
Titel: BBCode ähnliches Shorttags abfragen?
Hi Liebe Community!
Ich arbeite wie vielleicht der Eine oder Andere schon mitbekommen hat an einem HTML Konverter.
Ich weiss, dass das jetzt nichts Besonderes ist, aber es macht mir Spaß an ihm herumzuschrauben und seine Funktionen ständig zu erweitern. Ausserdem hat es einen nicht zu verachtenden Lerneffekt für mich als Delphi-Neuling.

Mein Problem ist nun folgendes:

Ich möchte, dass die Benutzer meines Konverters Short-Tags verwenden können. z.B. [b]Test[/b].
Jetzt habe ich aber das Problem, dass ich beim besten Willen nicht weiss, wie ich "[b]" abfragen kann.
Mit eine for-to Schleife dürfte das nur schwer möglich sein, da ich ja zB mit Text[i] nur einzelne Buchstaben abfragen kann, ich müsste aber das komplette "[b]" abfragen und auch das "[/b]"....
Ist das irgendwie umsetzbar?


jasocul - So 04.06.06 11:42

Wenn du eine Funktion, wie "Pos" meinst, würde ich dir einen Blick auf meine Website empfehlen. Dort findest du im Tutorial-Bereich eine Übersicht der wichtigsten String-Funktionen mit Erläuterungen und Source-Demo.


SunnyDream - So 04.06.06 11:52

Ich meine, dass mein Programm ein Shorttag wie zB [b] erkennt, und wenn es dieses Tag erkannt hat die passende Funktion ausführt.
Also konkret: Er soll den eingegebenen Text auf [b] und [/b] überprüfen, findet er ein [b] soll er an dieser Stelle im HTML Code ein <b> ausgeben, findet er ein [/b] das entsprechende </b> ausgeben.
Die Ausgabe o.Ä. sind kein Problem, doch wie schaffe ich es das mein Programm die [b] als Buchstabenfolge erkennt? Ich habe bisher nur Sachen kennen gelernt wie zB:


Delphi-Quelltext
1:
2:
3:
4:
5:
for i:=1 to length(Text) do
 if Text[i] = 'b' then
 begin
  Text[i] := a;
 end


Aber diese einfache Schleife ist wie gesagt nur in der Lage einzelne Buchstaben abzufragen in meinem Fall müsste aber eine Kette von Buchstaben abgefragt werden. Also nicht nur ein Buchstabe sondern "[b]" müsste er erkennen.... Du verstehst?

Moderiert von user profile iconChristian S.: BBCode aktiviert, ein paar Tags eingefügt


Born-to-Frag - So 04.06.06 11:59


Delphi-Quelltext
1:
StringReplace(aText, '[b]''<b>', [rfReplaceAll]);                    


greetz


jasocul - So 04.06.06 12:01


Delphi-Quelltext
1:
2:
3:
4:
5:
if pos('[b]', Text) > 0 then
begin
  Text[pos('[b]', Text)] := '<';
  Text[pos('[b]', Text)+2] := '>';
end

Das kann man noch besser machen, aber ich will dich nicht mit mehreren String-Funktionen auf einmal erschlagen.


SunnyDream - So 04.06.06 12:03

Ok Danke!
Ich werde mir dein Tutorial anschauen, da es ja scheinbar das war was ich suchte! Dnake euch :)


Born-to-Frag - So 04.06.06 12:03

@jasocul: sollte man das if nicht mit einem while ersetzen?


SunnyDream - So 04.06.06 12:09

Ohje... Ich habe noch eine Frage, die hiermit garnichts zu tun hat
Langsam wirds mir schon fast peinlich, seit ich hier angemeldet bin hab ich euch nur mit Neulingsfragen durchlöchert =/

Ich möchte, dass mein HTML-Konverter eine Vorschau-Funktion hat. Also wenn der User auf den Button "Vorschau" klickt, soll die Ausgabe als "temp.html" an einem festgelegten Ort gespeichert werden, ohne dass er dies bestätigen muss. (Also ohne das "Speichern" Fenster). Dann soll die Datei als HTML geöffnet werden und nach beendigung des Programms gelöscht werden.
Wie man etwas speichert weiss ich. Ich habe das bisher mit SaveDialog gemacht, ich weiss sogar wie man den namen der Datei festlegt und auch wie man einen Datei-filter einstellt. Aber ich weiss nicht wie ich es anstellen muss, dass die Datei an einem festen Ort gespeichert wird, ohne dass sich das Speichern Fenster vorher öffnet... Wie man die Datei dann ausführt weiss ich auch nicht =(


Christian S. - So 04.06.06 12:16

Hallo!

Bitte ertselle für jede neue Frage auch einen neuen Thread. Zum einen wird das innerhalb des Threads immer ziemlich durcheinander, wenn mehrere Fragen drin stecken. Außerdem kann jemand, der mittel Suchfunktion eine Lösung für ein ähnliches Problem sucht, am Titel nicht mehr erkennen, dass der Thread interessant für ihn ist.

Da die ursprüngliche Frage geklärt ist, mache ich hier zu. Sollten dazu noch Nachfragen kommen, reicht eine kurze Nachricht an den virtuellen Ansprechpartner, dann öffnen wir wieder.

Grüße
Christian

//edit: Da doch noch Nachfragen bestehen, habe ich das Thema wieder geöffnet.


SunnyDream - Mo 05.06.06 16:40

Hi!
Also bin nun dazu gekommen die Sache umzusetzen.
Jedoch stoße ich auf folgendes Problem, es wird einfach nichts Replaced.
Wie bereits erwähnt will ich in der Variable "RText" alle

Quelltext
1:
 [b],[/b],[i],[/i],[u],[/u]                    

durch

Quelltext
1:
 <b>, </b>, <i> (...)                    

ersetzen.

Hier mein Code:

- Funktion um Umlaute etc. zu ersetzen, hier soll auch das Replace von Statten gehen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
////////////////////////////////////////////////////////////////////////////////////////
//Textbearbeitungs Funktion/////////////////////////////////////////////////////////////
function Tform1.TextBearbeiten(InText: String): String;
 var ascii, i, ib: integer;
 begin
      RText:= '';
      for i:=1 to length(InText) do
          begin
               ascii:= ord(InText[i]);
               case ascii of
                   228: RText:= RText + 'ä' ;
                   196: RText:= RText + 'Ä' ;
                   246: RText:= RText + 'ö' ;
                   214: RText:= RText + 'Ö' ;
                   252: RText:= RText + 'ü' ;
                   220: RText:= RText + 'Ü' ;
                   223: RText:= RText + 'ß' ;
                   13: RText:= RText + chr(13) + chr(10) + '<br' ;
                   10: RText:= RText + '>' + chr(13) + chr(10);
               else
                   RText:= RText + chr(ascii);
            end;

                     StringReplace(RText, '[b]''<b>', [rfReplaceAll]);
                     StringReplace(RText, '[/b]''</b>', [rfReplaceAll]);
                     StringReplace(RText, '[i]''<i>', [rfReplaceAll]);
                     StringReplace(RText, '[/i]''</i>', [rfReplaceAll]);
                     StringReplace(RText, '[u]''<u>', [rfReplaceAll]);
                     StringReplace(RText, '[/u]''</u>', [rfReplaceAll]);

   result:= RText;
  end;
  end;


-Hier wird das Ergebnis der Funktion Textbearbeiten aufgerufen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure TForm1.Konvertieren1Click(Sender: TObject);

begin
     //(...) 
      InText:= MInput.Text;
      OutText:= TextBearbeiten(InText);

    //(...)
   //Hier wird OutText dann ausgegeben:
    with ROutPut.SelAttributes do
             begin
             Color:= clblue;
             end;
        ROutput.Lines.Add(OutText);
  //(...)
end;



Wo liegt mein Fehler?


Marc. - Mo 05.06.06 16:45

soweit ich weiß, muss es

Delphi-Quelltext
1:
2:
3:
4:
 
...
RText :=  StringReplace(RText, '[b]''[/b]', [rfReplaceAll]);
...
heißen :P


SunnyDream - Mo 05.06.06 16:47

Jipiee!
Das war's! Danke vielmals!