Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi groß/kleinschreibung (https://www.delphipraxis.net/63994-gross-kleinschreibung.html)

m.p.h. 25. Feb 2006 20:36


groß/kleinschreibung
 
hallo leute.
hab ein problem:

aus
hErMAn mEieR

soll
Herman Meier gemacht werden.
Wie kann man Namen so mit einer delphi-function formatieren?
:cry:

Matze 25. Feb 2006 20:48

Re: groß/kleinschreibung
 
Hi, herzlich willkommen!

Das ist etwas unperformant und auf die Schnelle hingecoded, müsste aber gehen:

Delphi-Quellcode:
function CreateCorrectName(MyName: string): string;
var
  i: Integer;
  TempName: string;
begin
  TempName := MyName;
  TempName := LowerCase(TempName);

  for i := 1 to Length(MyName) do
  begin
    if i = 1 then
      TempName[i] := UpperCase(TempName[i])[1] else
    if TempName[i - 1] = ' ' then
      TempName[i] := UpperCase(TempName[i])[1]
  end;

  result := TempName;
end;
Nur wenn das tausende Namen sind, die du formatieren musst, würde ich wohl nach einer anderen Lösung suchen. :zwinker:


Edit: Da war eine Zeile zuviel. ^^

alzaimar 25. Feb 2006 20:50

Re: groß/kleinschreibung
 
Du gehst einfach iterativ durch den String durch. Der erste Buchstabe nach einem Leerzeichen (oder der erste buchstabe überhaupt) wird groß, der Rest klein geschrieben.
Delphi-Quellcode:
Var
  bFirst : boolean;
  i : Integer;

Begin
  bFirst := True; // <-- Nachträglich eingefügt
  For i := 1 to Length (aWord) do Begin
    If bFirst Then begin
      aWord[i] := Upc(aWord[i]);
      bFirst := False;
      end
    else
      aWord[i] := LowerCase(aWord[i]);
    bFirst := (aWord[i]=' ');
  End;
End;

Nicolai1234 25. Feb 2006 20:55

Re: groß/kleinschreibung
 
Kann man nicht ersteinmal alle klein machen und dann über pos(' ')+1 die ersten Buchstaben großmachen? Da sollte doch schneller gehen, oder?

markusj 25. Feb 2006 21:03

Re: groß/kleinschreibung
 
Hallo,

du lässt eine Schleife von 1 bis length(string) über den String laufen und checkst in dieser Schleife ob du:
a) ein Leerzeichen hast, wenn ja wird das nächste Zeichen Großgeschrieben
b) kein Leerzeichen hast, dann wird das aktuelle Zeichen, wenn nicht durch a) ein durchlauf vorher "markiert" kleingeschrieben

Klein und Großschreibung geht mit uppercase und lowercase

mfG

Markus

Delphi-Quellcode:
function correctName(str : string):string;
var up : boolean;
var i : integer;
begin
 up := false;
 str[1] := uppercase(str[1]);
 for i := 2 to length(str) do
  begin
  if str[i] <> ' ' then
   begin
   if up then str[i] := uppercase(str[i) else str[i] := lowercase(str[i]);
   up := false;
   end else
   begin
   up := true;
   end;
  end;
 result := str;
end;
EDIT: @ Nikolai: Oder man machts so wie ich (oder dein Vorredner) und macht alles klein, was nicht groß werden soll
Ups, ich stelle gerade fest, dass der Code meines VorVorrednera eigentlich identisch mit meinem ist ... Pech gehabt ^^

alzaimar 25. Feb 2006 21:10

Re: groß/kleinschreibung
 
Zitat:

Zitat von Nicolai1605
Kann man nicht ersteinmal alle klein machen und dann über pos(' ')+1 die ersten Buchstaben großmachen? Da sollte doch schneller gehen, oder?

Nein, denn dann gehst du den String 2x durch. So, wie markusj und ich es vorgeschlagen haben, ist es optimal schnell (zumindest vom Verfahren). Ein paar Prozentchen dürfte man noch mit ASM rauskitzeln. Vielleicht.

Matze 25. Feb 2006 21:17

Re: groß/kleinschreibung
 
Zitat:

Zitat von alzaimar
Nein, denn dann gehst du den String 2x durch. So, wie markusj und ich es vorgeschlagen haben, ist es optimal schnell (zumindest vom Verfahren).

Sicher? Ich denke, mein Verfahren ist etwas schneller, da LowerCase bei mir nur ein einziges Mal aufgerufen wird und nicht für jeden Buchstaben, der klein zu schreiben ist.

Aber kann ich selbstverständlich irren.

Daniel G 25. Feb 2006 21:17

Re: groß/kleinschreibung
 
Sagt mal, geht das nur mir so, oder fehlt in alzaimars Code trotz der Deklaration als "Delphi-Code" das Syntaxhighlighting? :gruebel:

Matze 25. Feb 2006 21:18

Re: groß/kleinschreibung
 
Zitat:

Zitat von Daniel G
Sagt mal, geht das nur mir so, oder fehlt in alzaimars Code trotz der Deklaration als "Delphi-Code" das Syntaxhighlighting? :gruebel:

Geht mir ebenfalls so, da muss ein kleiner Bug im Caching-/Parsing-System o.ä. vorliegen. Den genauen Fehler konnte Daniel imho noch nicht entdecken.

Flare 25. Feb 2006 21:25

Re: groß/kleinschreibung
 
ich würde sagen, dass bei dem code das highlightening fehlt, weil dort die begriffe, die normalerweise ge-highlightet werden alle groß geschrieben sind und es deswegen nicht werden.

Flare

Nicolai1234 25. Feb 2006 21:28

Re: groß/kleinschreibung
 
nein, daran liegt es nicht! Code von alzaimar in "richtiger" Form:
Delphi-Quellcode:
Var
  bFirst : boolean;
  i : Integer;

Begin
  bFirst := True; // <-- Nachträglich eingefügt
  For i := 1 to Length (aWord) do Begin
    If bFirst Then begin
      aWord[i] := Upc(aWord[i]);
      bFirst := False;
      end
    else
      aWord[i] := LowerCase(aWord[i]);
    bFirst := (aWord[i]=' ');
  End;
End;

Peter Mössinger 25. Feb 2006 22:54

Re: groß/kleinschreibung
 
Hallo Nicolai1605,

ich denke so klappt es auch und ist noch etwas schöner:

Delphi-Quellcode:
Var
  bFirst : boolean;
  i : Integer;

Begin
  bFirst := True;
  For i := 1 to Length (aWord) do Begin
    If bFirst Then aWord[i] := Upc(aWord[i])
     else aWord[i] := LowerCase(aWord[i]);
    bFirst := (aWord[i]=' ');
  End;
End;

danku 17. Mai 2006 15:37

Re: groß/kleinschreibung
 
Zitat:

Zitat von Matze
Hi, herzlich willkommen!

Das ist etwas unperformant und auf die Schnelle hingecoded, müsste aber gehen:

Delphi-Quellcode:
function CreateCorrectName(MyName: string): string;
var
  i: Integer;
  TempName: string;
begin
  TempName := MyName;
  TempName := LowerCase(TempName);

  for i := 1 to Length(MyName) do
  begin
    if i = 1 then
      TempName[i] := UpperCase(TempName[i])[1] else
    if TempName[i - 1] = ' ' then
      TempName[i] := UpperCase(TempName[i])[1]
  end;

  result := TempName;
end;
Nur wenn das tausende Namen sind, die du formatieren musst, würde ich wohl nach einer anderen Lösung suchen. :zwinker:


Edit: Da war eine Zeile zuviel. ^^

hab das mit einer tstringgrid probiert aber keine reaktion ergab sich in der. :gruebel:

himitsu 17. Mai 2006 15:44

Re: groß/kleinschreibung
 
Wie wäre es in der Art

Delphi-Quellcode:
Function CreateCorrectName(Const MyName: String): String;
  Var i: Integer;

  Begin
    Result := AnsiLowerCase(Trim(MyName));
    If Result = '' Then Exit;
    i := 1;
    While i > 0 do Begin
      Result[i] := UpperCase(Result[i]);
      i := PosEx(' ', Result, i);
      If i <> 0 Then Inc(i);
    End;
  End;
PS: Wer hat behauptet, daß das erste Zeichen nicht auch schon ein Leerzeichen ist und ob überhaupt was eingegeben wurde?

TeronG 17. Mai 2006 15:51

Re: groß/kleinschreibung
 
Zitat:

Zitat von Peter Mössinger
Hallo Nicolai1605,

ich denke so klappt es auch und ist noch etwas schöner:

Delphi-Quellcode:
Var
  bFirst : boolean;
  i : Integer;

Begin
  bFirst := True;
  For i := 1 to Length (aWord) do Begin
    If bFirst Then aWord[i] := Upc(aWord[i])
     else aWord[i] := LowerCase(aWord[i]);
    bFirst := (aWord[i]=' ');
  End;
End;

du setzt aber bFirst nicht mehr auf False

Zitat:

Zitat von himitsu
PS: Wer hat behauptet, daß das erste Zeichen nicht auch schon ein Leerzeichen ist und ob überhaupt was eingegeben wurde?

Da hat der mann mit den schönen Bäumen wohl recht ^^

himitsu 17. Mai 2006 15:57

Re: groß/kleinschreibung
 
Außerdem muß ein Name ja nicht unbedingt per " " getrennt sein ... Doppelnamen werden oft per "-" getrennt und wenn man zuerst den Nachnamen angibt, mach man im Allgemeinen ein "," rein.
Delphi-Quellcode:
Function CreateCorrectName(Const MyName: String): String;
  Var i: Integer;

  Begin
    Result := AnsiLowerCase(Trim(MyName));
    i := 1;
    While i <= Length(Result) do Begin
      Result[i] := UpperCase(Result[i]);
      While (i <= Length(Result) and not (Result[i] in [' ', '-', ',']) do Inc(i);
      Inc(i);
    End;
  End;
In dem Code wird zwar bei mehreren aufeinanderfolgenden " ", "-" und/oder "," zwar unnötig versucht eines der Zeichen Großzuschreiben, aber dat is ja eigentlich egal ... jedenfalls wäre 'ne Abfrage um das zu verhindern nicht sehr viel Performanceeinbringender ^^

danku 17. Mai 2006 15:58

Re: groß/kleinschreibung
 
klar. ich test das jetzt mal in meiner stringgrid mit der 1.spalte.
cya

Dale 17. Mai 2006 16:04

Re: groß/kleinschreibung
 
Hallo,

eine andere Möglichkeit wäre es mit Hilfe einer Stringliste zu lösen:

Delphi-Quellcode:
FUNCTION CreateCorrectName(MyName: STRING): STRING;
VAR

  i   : Integer;
  Liste: TStrings;
 
BEGIN

  Liste := TStringList.Create;
  Liste.Delimitier := ' ';              // Hier muss natürlich ein Leerzeichen stehen
  Liste.DelimitedText := MyName;
 
  FOR i := 0 TO Liste.Count - 1 DO
    Liste[i] := UpperCase(Liste[i]);    // und da hat eine Klammer gefehlt
   
  Result := Liste.DelimitedText;
 
  Liste.Free;
 
END;
Grüße von Dale

TeronG 17. Mai 2006 16:08

Re: groß/kleinschreibung
 
Delphi-Quellcode:
MyName[i] := UpperCase(MyName[i]);
Zitat:

[Fehler] Unit1.pas(35): Inkompatible Typen: 'Char' und 'String'
evtl. MyName[i] := UpCase(MyName[i]);

Delphi-Quellcode:
While not (MyName[i] in [' ', '-', ',']) do Inc(i);
Zitat:

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 0044E282 in Modul 'Project1.exe'. Lesen von Adresse 00CF4000'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------

himitsu 17. Mai 2006 16:12

Re: groß/kleinschreibung
 
Tut mir leid, hab halt die Parameter von UpCase nicht im Kopf ... schau mal in die OH, aber vielleicht hilf da
UpCase(MyName[i])[1];

Und wegen der "linken Seite" ... geh nochmal in meinen Post da oben (hatte einiges durch Result ersetzt :zwinker: und gerade noch ein (i <= Length(Result) and eingefügt :stupid: )

TeronG 17. Mai 2006 16:25

Re: groß/kleinschreibung
 
Zitat:

Zitat von himitsu
Und wegen der "linken Seite" ... geh nochmal in meinen Post da oben (hatte einiges durch Result ersetzt :zwinker: und gerade noch ein (i <= Length(Result) and eingefügt :stupid: )

schon gesehen ^^ (und ge-edited)

UpperCase(const S: string): string; mag er nich .. aber UpCase( ch : Char ) : Char; mag er ^^

und gegen
Delphi-Quellcode:
While (i <= Length(Result) and not (Result[i] in [' ', '-', ',']) do Inc(i);
hat er das:
[Fehler] Unit1.pas(37): Operator ist auf diesen Operandentyp nicht anwendbar :gruebel:

EDIT: ahh da fehlt ne klammer zu!
Delphi-Quellcode:
While (i <= Length(Result)) and not (Result[i] in [' ', '-', ',']) do Inc(i);

danku 21. Mai 2006 16:20

Re: groß/kleinschreibung
 
Zitat:

Zitat von himitsu
Außerdem muß ein Name ja nicht unbedingt per " " getrennt sein ... Doppelnamen werden oft per "-" getrennt und wenn man zuerst den Nachnamen angibt, mach man im Allgemeinen ein "," rein.
Delphi-Quellcode:
Function CreateCorrectName(Const MyName: String): String;
  Var i: Integer;

  Begin
    Result := AnsiLowerCase(Trim(MyName));
    i := 1;
    While i <= Length(Result) do Begin
      Result[i] := UpperCase(Result[i]);
      While (i <= Length(Result) and not (Result[i] in [' ', '-', ',']) do Inc(i);
      Inc(i);
    End;
  End;
In dem Code wird zwar bei mehreren aufeinanderfolgenden " ", "-" und/oder "," zwar unnötig versucht eines der Zeichen Großzuschreiben, aber dat is ja eigentlich egal ... jedenfalls wäre 'ne Abfrage um das zu verhindern nicht sehr viel Performanceeinbringender ^^


ich hab die fehler geändert aber trotzdem geht das noch nicht?

aufgerufen mit:

for i:= 0 to sgfiles.RowCount-1 do begin
CreateCorrectName(sgfiles.cells[0,i]);

Hawkeye219 21. Mai 2006 17:05

Re: groß/kleinschreibung
 
Hallo danku,

himitsu stellt dir eine Funktion zur Verfügung, keine Prozedur :wink:

Delphi-Quellcode:
sgfiles.cells[0,i] := CreateCorrectName(sgfiles.cells[0,i]);
Gruß Hawkeye

himitsu 21. Mai 2006 17:29

Re: groß/kleinschreibung
 
Stimmt ... StringGrid.Cells ist ein Property (ist doch eines?) und da gibt's entweder Setter-, oder Getter-Methoden, man kann also den Wert entweder nur auslesen, oder setzen ... also nicht gleichzeitig, somit ist es nicht möglich dieses als eine Variable zu übergeben.

Lösung: siehe Vorredner ^^
Delphi-Quellcode:
SetterMethode := CreateCorrectName(GetterMethode);

// GetterMethode > get - Wert auslesen
// SetterMethode > set - Wert setzen/ändern

danku 21. Mai 2006 17:30

Re: groß/kleinschreibung
 
wie kann ich das noch erweitern wenn z.b. folgender fall vorliegt:

test+test2 -> wird nach dem obengenannten prinzip so formatiert: Test+test2

Ziel:

test+test2 -> Test + Test2

danku 22. Mai 2006 18:59

Re: groß/kleinschreibung
 
hat einer eine ahnung?

himitsu 22. Mai 2006 19:53

Re: groß/kleinschreibung
 
einfach nach dem Plus suchen und dann jeweils das Zeichen davor und dahinter prüfen, ob's ein Leerzeichen ist und wenn nicht, dann einfach eines einfügen

Was man z.B. z.B. machen kann:
Delphi-Quellcode:
i := Pos('+', S);
If i <> 0 Then Begin
  If (i > 1) and (S[i - 1] <> ' ') Then Insert(' ', S, i);
  If (i < Length(S)) and (S[i + 1] <> ' ') Then Insert(' ', S, i + 1);
End;


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