Selamlar
elimdeki "s : String" ve "ws : WideString" olarak iki değişkeni
içerisinde büyük/küçük harf ve başlangıç/bitiş gibi kurallara bakmaksızın
"s" değerinin "ws" içerisinde olup olmadığını karşılaştıran bir komut varmıdıdır.
benim denemelerimde aşağıdakiler ile sonuç alamadım.
illaki değerleri uppercase yapmak gerekiyor.
Pos -> küçük harf büyük harfe takılıyor
AnsiContainsStr, AnsiCompareStr -> başlangıç değerleri için boşluk arıyor ve küçük büyük ayırıyor
Teşekkürler
String Karşılaştırma İşlemleri Hakkında
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- adelphiforumz
- Üye
- Mesajlar: 602
- Kayıt: 01 Nis 2008 05:38
- Konum: İstanbul
String Karşılaştırma İşlemleri Hakkında
Ehil olmayanlara sabretmek ehil olanları parlatır.
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Akıllı birisinden gelen cefa, bilgisizlerin vefasından iyidir.
Bilgiye ulaştı mı ayak, kanat olur
Biz insanı kıyafetiyle ağırlar bilgisiyle uğurlarız.
Mevlana
Re: String Karşılaştırma İşlemleri Hakkında
Merhaba,
Büyük küçük harf duyarsız şekilde string karşılaştırması yapar iken mutlaka her ikisini de büyük veya her ikisini de küçük harf yapmalısınız. Bunun bilgisayarın anlayabileceği başka bir şekli yok. Ancak bu işlemi Pos() ile değil başka fonksiyonlar yardımı ile yaparsanız bu kullanılan fonksiyonlar arka planda büyük veya küçük harf dönüşümünü yapacaklardır.
Delphi 7 içinde mevcut mu emin değilim. Ancak yeni sürümler için aşağıdaki gibi bir kod yazabilirsiniz.
Ancak Delphi içindeki bu standart fonksiyon aşağıdaki alternatrife göre yaklaşık 4 kat daha yavaş çalışmaktadır.
Kaynak: https://stackoverflow.com/questions/154 ... sitive-pos
Kullanımı Pos() fonksiyonu ile aynıdır ve aşağıdaki gibidir.
Her iki fonksiyon ile de yaşanacak sorun "ı" ve "İ" harfleri olacaktır. Bu iki fonksiyon da küçük "ı" veya büyük "İ" harfini Türkçe dil kurallarına göre dönüştürüp algılayamaz. Ancak sizin sorunuz içinde geçen UpperCase() veya LowerCase() fonksiyonlarında da aynı sorun mevcut olduğu için cevap veriyorum.
Büyük küçük harf duyarsız şekilde string karşılaştırması yapar iken mutlaka her ikisini de büyük veya her ikisini de küçük harf yapmalısınız. Bunun bilgisayarın anlayabileceği başka bir şekli yok. Ancak bu işlemi Pos() ile değil başka fonksiyonlar yardımı ile yaparsanız bu kullanılan fonksiyonlar arka planda büyük veya küçük harf dönüşümünü yapacaklardır.
Delphi 7 içinde mevcut mu emin değilim. Ancak yeni sürümler için aşağıdaki gibi bir kod yazabilirsiniz.
Kod: Tümünü seç
uses
StrUtils;
procedure TForm1.Button1Click(Sender: TObject);
var
TempString: string;
TempWideString: WideString;
begin
TempString := 'Üğ';
TempWideString := 'Küçük büyük harf için "üğI" test';
if ContainsText(TempWideString, TempString) then
begin
ShowMessage('Evet');
end;
end;
Kod: Tümünü seç
unit NewStrUtils;
interface
type
TCharUpCaseTable = array [Char] of Char;
procedure InitCharUpCaseTable(var Table: TCharUpCaseTable);
function InsensPosEx(const SubStr, S: string; Offset: Integer = 1): Integer;
implementation
uses
Winapi.Windows;
var
CharUpCaseTable: TCharUpCaseTable;
procedure InitCharUpCaseTable(var Table: TCharUpCaseTable);
var
I: Cardinal;
begin
for I := 0 to Length(Table) - 1 do
Table[Char(I)] := Char(I);
CharUpperBuff(@Table, Length(Table));
end;
function InsensPosEx(const SubStr, S: string; Offset: Integer = 1): Integer;
var
n :integer;
SubStrLength :integer;
SLength :integer;
label
Fail;
begin
SLength := length(s);
if (SLength > 0) and (Offset > 0) then
begin
SubStrLength := length(SubStr);
Result := Offset;
while SubStrLength <= SLength - result + 1 do
begin
for n := 1 to SubStrLength do
if CharUpCaseTable[SubStr[n]] <> CharUpCaseTable[s[result + n - 1]] then
goto Fail;
Exit;
Fail:
Inc(result);
end;
end;
Result := 0;
end;
initialization
InitCharUpCaseTable(CharUpCaseTable);
end.
Kullanımı Pos() fonksiyonu ile aynıdır ve aşağıdaki gibidir.
Kod: Tümünü seç
uses
NewStrUtils;
procedure TForm1.Button1Click(Sender: TObject);
var
TempString: string;
TempWideString: WideString;
begin
TempString := 'Üğ';
TempWideString := 'Küçük büyük harf için "üğI" test';
if InsensPosEx(TempString, TempWideString) > 0 then
begin
ShowMessage('Evet');
end;
end;