Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Buchstaben sortieren aus einem Memofeld (https://www.delphipraxis.net/139155-buchstaben-sortieren-aus-einem-memofeld.html)

Fussel9 24. Aug 2009 20:39


Buchstaben sortieren aus einem Memofeld
 
(A)Hoi,

Ich wollte gerne ein programm schreiben, bei dem man einen Text ein gibt und auf Knopfdruck soll dieser ''Sortiert'' werden, d.h. alle A's alle B's und so weiter sollen hinter ein ander in ein zweites Memofeld geschrieben werden, zuvor soll aber die ausgangsposition der Buchstaben gespeichert werden so das der Text hinterher wieder rekonstuiert werden kann
Beispiel:

Eine Ente geht spatzieren. <----------> aEeEeeeeghiinnnprstttz

mkinzler 24. Aug 2009 20:41

Re: Buchstaben sortieren aus einem Memofeld
 
Und was ist deine Frage?

Fussel9 24. Aug 2009 20:43

Re: Buchstaben sortieren aus einem Memofeld
 
öhm , ja mir fehlt jegweder ansatz gibts ne funktion mit der ich nen memo text nach nem bestimmten Buchstaben dursuchen kann oder mit dem ich irgend wie arbeiten kann???

Für alles offen^^

mkinzler 24. Aug 2009 20:44

Re: Buchstaben sortieren aus einem Memofeld
 
-Pos()/PosEx()
-StrScan()

Fussel9 24. Aug 2009 20:48

Re: Buchstaben sortieren aus einem Memofeld
 
Danke schon mal, aber diese Hilfe aus der Delphihilfe ist ein wenig verwirrend , kamm ir jemand ein Beispiel geben?

Zitat:

Syntax


[Delphi] function PosEx(const SubStr: string; const S: string; Offset: Integer): Integer;


Beschreibung
PosEx gibt den Index von SubStr in S zurück, wobei die Suche bei Offset begonnen wird. Wenn Offset 1 ist (Vorgabe), entspricht PosEx Pos.

PosEx gibt 0 zurück, wenn SubStr nicht gefunden wird, Offset größer als die Länge von S ist oder Offset kleiner als 1 ist.

PS: Mit StrScan kann ich leider nicht mein Memo absuchen, da ich die fehlermeldung bekomme:

Inkompatible Typen TString und PAnsiChar, leider konnte ich auch über die Hilfe nicht viel über ein PAnsiChar herrausfinden, was muss ich tun???

mkinzler 24. Aug 2009 21:01

Re: Buchstaben sortieren aus einem Memofeld
 
Delphi-Quellcode:
p := Pos( 'Du', 'Hallo Du');
ergibt 7, weil das erste Vorkommen vom 1.String an 7. Stelle im 2.String beginnt.

Das PosEx() erweitert das Ganze um eine Offset, ab dem gesucht wird
Delphi-Quellcode:
p := PosEx( 'Du', 'Hallo DuDu!', 8);
ergibt also 9.

[Edit: PAnsiChar ist ein Zeiger auf einen String

Delphi-Quellcode:
p := PAnsiChar(<String>);
]

Fussel9 24. Aug 2009 21:09

Re: Buchstaben sortieren aus einem Memofeld
 
Danke, mal sehn obs geht, sonst meld ich mich nochma :thumb:

xZise 24. Aug 2009 21:58

Re: Buchstaben sortieren aus einem Memofeld
 
Hmmm du könntest dich vielleicht mit Bucketsort beschäftigen?

Dafür würde ich dann ein zweidimensionales Array nehmen und vorher einen Record typisieren, in der du Zeichen/Position speicherst.
Delphi-Quellcode:
type
  TCharPosArr = record
    CharPosArr : array of TCharPos;
    CharSet : TSysCharSet; // Darin kann man mehrere Zeichen speichern die du dann mit "in" überprüfen kannst
  end;

  TCharPos = record
    C : Char;   // Zeichen
    P : Integer; // Position
  end;

var
  CharPos : array [0..25] of TCharPosArr;
Und jetzt musst du zuerst dein Array initialisieren:
Delphi-Quellcode:
CharPos[0].CharSet := ['aAäÄ']; // d.h. alle a/A/ä/Ä werden darein sortiert
CharPos[1].CharSet := ['...'];
Das kannst du natürlich auch in eine Schleife packen (wobei du dann die Umlaute (evtl.) mit beachten musst!).

Und dann gehst du jetzt jedes Zeichen durch und testest, ob das Zeichen zu den erstem zum zweiten etc. passt:
Delphi-Quellcode:
if Str[i] in CharPos[j].CharSet then
begin
  // Einen neuen Eintrag anfügen
  SetLength(...);
  CharPos[High(CharPos)]....
  // Und dann das Gesuche des richtigen "Korbes" abbrechen
  Break;
end;
Ich hoffe das war einigermaßen verständlich.

MfG
xZise

Hawkeye219 24. Aug 2009 22:35

Re: Buchstaben sortieren aus einem Memofeld
 
Hallo,

eine Delphi-Referenz durchsuchenTStringList bietet eigentlich alles, was man zur Lösung dieser Aufgabe benötigt. Die Zeichen können direkt abgelegt werden, ihre Position - als Pointer-Cast - in der Eigenschaft Objects[]. Das Sortieren übernimmt der eingebaute Quicksort-Algorithmus der Stringliste.

Gruß Hawkeye

Fussel9 26. Aug 2009 22:34

Re: Buchstaben sortieren aus einem Memofeld
 
Hi, back to the problem... ;)

Ich lasse mein Programm die Eingabe in eine StringList einlesen,
dann setze ich meine zwei dynamischen Arrays auf die Lenge der Eingabe....

wie auch immer... dann lasse ich den Buchstaben in dem einen Array abspeichern
und die Position in dem anderem Array...

mein letztes ''Problem'' besser meine Frage:

Gibt es keine Möglichkeit die Buchstaben nicht alle selbst eingeben zu müssen, gibt es nicht irgendwo ein Alphabet in Delphi welches ich in ne Stringliste einlesen kann oder so? So dass ich später ne for to do nehmen kann also

for i:=0 to Alphabetliste.Count do
begin
Buchstabe:=Alphabetliste[i];
end;

oder zumindest so ähnlich???

Uwe Raabe 26. Aug 2009 22:47

Re: Buchstaben sortieren aus einem Memofeld
 
Irgendwie habe ich Schwierigkeiten, deine Problemstellung zu verstehen.

Ausgehend von deinem Beispiel
Zitat:

Eine Ente geht spatzieren. <----------> aEeEeeeeghiinnnprstttz
ist doch die einfachste, sparsamste und schnellste Möglichkeit den Originalzustand wieder herzustellen, einfach den Originaltext zu speichern. Und das Sortieren eines Strings mit oder ohne Beachtung der Groß/Kleinschreibung sollte nun wirklich kein Problem sein.

Ich vermute, ich habe das große Ganze noch nicht erfasst.

Fussel9 26. Aug 2009 23:03

Re: Buchstaben sortieren aus einem Memofeld
 
Ich möchte gern, dass mein Programm einen Text nimmt und ihn unlesbar macht...

niemand weiß was aEEeeeeeghiinnnprstttz heißt daher soll der Text in dieser Form gespeichert werden.

Damit man den Text rekonstruieren kann muss natürlich auch die Position jedes Buchstabens und jedes Leerzeichens...Satzzeichens allgemein gespeichert werden...

hast du nun verstanden?

Text rein--> Sinnlos raus

die speicherung soll dann in ner ini oder was weiß ich vorgenommen werden aber das ist ja neben sächlich...(der sinnlose Text z.B. in ner txt und die zahlen in ner ini oder nem eigenen format...)

BUG 26. Aug 2009 23:32

Re: Buchstaben sortieren aus einem Memofeld
 
Andere Lösung:
Wende z.b. Bubblesort auf den String an und merke dir in der Tauschen-Prozedur die Vertauschungen ... wenn du diese dann rückwärts durchführst, solltest du den ursprünglichen String erhalten.

Wenn du es so machst, könntest du denn String aber auch zufällig verwirbeln:
Delphi-Quellcode:
function Wirbel(x: String): String;
var i: integer;

  procedure tausche(a, b: integer);
  var temp: char;
  begin
    temp := result[a];
    result[a] := result[b];
    result[b] := temp;
    merke(a, b);
  end;

begin
  if length(x) > 1 then
  begin
    result := x;
    for i := 1 to length(x) do tausche(i, random(length(x))+1);
  end;
end;
Das würde mit weniger Vertauschungen als z.B. Bubblesort auskommen (randomize nicht vergessen).

MfG,
Bug

PS: Es ist natürlich klar, dass das alles keine Verschlüsselung ist, sondern eher eine "Verschlüsselung" :zwinker:

mkinzler 27. Aug 2009 05:38

Re: Buchstaben sortieren aus einem Memofeld
 
Für die Verschlüsselung gibt es eh besser Methoden (§DES, AES, ...) schau dir mal DEC an.

Satty67 27. Aug 2009 06:11

Re: Buchstaben sortieren aus einem Memofeld
 
Da es scheinbar nicht zwingend darum geht, ein Memofeld zu sortieren, sondern einen Eintrag in der INI-Datei zu verstecken...

MKinzler hat es schon geschrieben, dass es dafür fertige Verschlüsselungsverfahren gibt. Um INI-Einträge vor "normalen" neugierigen Benutzern zu schützen, hatte ich schon länger eine einfachen 8-Bit Verschlüsselung gebastelt. Dies ist natürlich überhaupt nicht sicher, gegen erfahrene Angriffe. Aber schützt wirksam vor neugierigen Otto-Normal-PC-Anwendern ;)

Der übergebene String kann auch Memo.Text sein, da Sonderzeichen wie Linefeed, Tab oder Return kein Problem sind. Der "verschlüsselte" Text wird als Hex-String ausgegeben, damit ein speichern in einer INI-Datei kein Problem ist.

Delphi-Quellcode:
function StrToCryptHex(Text: String; XorVal : Byte): String;
var
  i, Count : Integer;
  b : Byte;
begin
  Count := Length(Text);
  Result := '';
  for i := 1 to Count do begin
    b := Ord(Text[i]);
    XorVal := b XOR XorVal;
    Result := Result + IntToHex(XorVal, 2);
  end;
end;

function CryptHexToStr(Text: String; XorVal : Byte): String;
var
  i, Count : Integer;
  b : Byte;
begin
  Count := Length(Text) div 2;
  Result := '';
  for i := 0 to Count-1 do begin
    b := StrToInt('$'+Copy(Text, i*2+1, 2));
    XorVal := b XOR XorVal;
    Result := Result + Chr(XorVal);
    XorVal := b;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  XorVal = $AA; // beliebiger Bytewert
var
  AString : String;
begin
  AString := 'Dieser Text wird für normale PC-Anwender versteckt.';
  // Testanzeige
  ListBox1.Items.Add(AString);
  // "Verschlüsseln"
  AString := StrToCryptHex(AString, $AA);
  // Ergebnis
  ListBox1.Items.Add(AString);
  // "Entschlüsseln"
  AString := CryptHexToStr(AString, $AA);
  // Ursprung wieder hergestellt
  ListBox1.Items.Add(AString);
end;

xZise 27. Aug 2009 10:06

Re: Buchstaben sortieren aus einem Memofeld
 
Zitat:

Zitat von Fussel9
Ich möchte gern, dass mein Programm einen Text nimmt und ihn unlesbar macht...

niemand weiß was aEEeeeeeghiinnnprstttz heißt daher soll der Text in dieser Form gespeichert werden.

Damit man den Text rekonstruieren kann muss natürlich auch die Position jedes Buchstabens und jedes Leerzeichens...Satzzeichens allgemein gespeichert werden...

hast du nun verstanden?

Text rein--> Sinnlos raus

die speicherung soll dann in ner ini oder was weiß ich vorgenommen werden aber das ist ja neben sächlich...(der sinnlose Text z.B. in ner txt und die zahlen in ner ini oder nem eigenen format...)

Dann musst du aber zu jedem Buchstaben auch die Position speichern ;) Und da würde ich dir wie mkinzler schon gesagt hat, zu "echten" Verschlüsslungen greifen. Nicht nur weil sie sicherer sind, sondern weil du dir keinen Kopf um das "wie" machst. Du "jagst" es nur durch eine Prozedur die es dir Verschlüsselt und fertig. Nagut fürs erste mal muss man sich reinfuchsen. Aber ich verwende Rijndael in einem Programm um die Namen zu verschlüsseln und ich bin sehr froh das so gemacht zu haben ;) Weil ich habe mir eine lange Zeit den Kopf zermatert wie ich das hinkriege, aber dann stand das Testprogramm und dass musste dann nur noch in das Original emigriert werden. Außerdem hatte ich nur so lange gebraucht, um das "sinnvoll" einzubauen, da ich nur Teile verschlüssele.

Übrigens meint mkinzler mit §DES nur 3DES :D
Also ich würde Twofish oder AES verwenden, weil sie sicher und schnell sind. Ich mein, warum auf Sicherheit verzichten, wenn es nur etwas anders ist :P

Delphi-Quellcode:
function Verschluesseln(AKlartext : string; ACipher : TDECCipher) : string;
begin
  Result := ACipher.EncodeBinary(AKlartext, TFormat_HEXL);
  ACipher.Done;
end;

function Go : string;
const
  SRC = '....' // Dein Klartext
var
  C : TDECChipher;
begin
  C := TCipher_Rijndael.Create;
  try
    C.Mode := cmCTSx;
    Result := Verschluesseln(SRC, C);
  finally
    C.Free;
  end;
end;
MfG
xZise

Fussel9 27. Aug 2009 21:03

Re: Buchstaben sortieren aus einem Memofeld
 
Das is alles wunderbar, aber beantwortet nicht meine frage, ich danke euch mal für die vielen posts, doch ich wollte eigentlich meine idee eines Schlüssel-Schloss prinzips durchbringen...

Also nochmal...
Muss ich alle Zeichen einzeln überprüfen lassen oder gibt es eine Zeichen Bibliothek in delphi...

mfg
der Fussel :)

Draos 27. Aug 2009 21:24

Re: Buchstaben sortieren aus einem Memofeld
 
Delphialphabet ist mir nicht bekannt.

Aber es gibt LowerCase() und UpperCase() und die Funktion Chr() und eine Ansii-Tabelle. Damit kannste locker eine Schleifefühlen und brauchst nur nach z.B. checken ob:

Delphi-Quellcode:
if LowerCase(Text[i])=AlphaBet[j] then
Mal ein Beispiel. Eine--->eEin.
Ne Idee wäre, dass Speichern der genauen Position nur des 1. Zeichens und danach den Positionsunterschied. Nach dem Beispiel:
2=>1=>1=>-3

Hawkeye219 27. Aug 2009 21:50

Re: Buchstaben sortieren aus einem Memofeld
 
Hallo Fussel,

so meinte ich das in meinem Beitrag #9:

Delphi-Quellcode:
var
  SL: TStringList;
  InputText: string;
  OutputText: string;
  i: Integer;
begin
  SL := TStringList.Create;
  try
    InputText := MemoInput.Text;

    // Buchstaben und zugehörige Positionen in der Stringliste ablegen
    // (die Positionen werden in SL.Objects[] gespeichert)
    for i := 1 to Length(InputText) do
      SL.AddObject (InputText[i], Pointer(i));

    // Stringliste nach den Buchstaben sortieren
    SL.Sort;

    // Ausgabetext dimensionieren
    SetLength (OutputText, SL.Count);

    // Zeichen für Zeichen aus der Stringliste holen und über die
    // gespeicherte Position in den Ausgabestring einsetzen
    for i := 0 to SL.Count - 1 do
      OutputText[Integer(SL.Objects[i])] := SL[i][1];

    ShowMessage (OutputText);
  finally
    SL.Free;
  end;
end;
Die Kommentare sollten dir helfen, den Quelltext zu verstehen.

Gruß Hawkeye


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