DELPHI Sorular

Başlatan bunalmis, 05 Ağustos 2004, 10:50:29

Mrtecno

Sanırım bu da işinizi görür. İlk Kod pascal da, diğeri DELPHİ 7 de yazıldı ikiside çalışıyor;
Fonksiyon eğer string bilgi sayı ise integer döndürür,Eğer Sayı değilse Hata Döndürecektir.
-----------------------------------------------------------
Kod 1 -Pascal
-----------------------------------------------------------

Procedure StrToSay(S:string; var Sayi:integer;var Hata:boolean);
Var
i,L:byte;
c:integer;
 Begin
 Hata:=False;
 L:=Length(S);
 For i:=1 To L Do
  Begin
   if not(s in ['0'..'9']) Then
    Hata:=True;
  End;
if Hata=False Then
 Val(S,Sayi,c);
End;

----------------------------------------------------------------
Kod-2 Delphi7
----------------------------------------------------------------

implementation

{$R *.dfm}
Procedure StrToSay(S:string; var Sayi:integer;var Hata:boolean);
Var
i,L:byte;
c:integer;
 Begin
 Hata:=False;
 L:=Length(S);
 For i:=1 To L Do
  Begin
   if not(s in ['0'..'9']) Then
    Hata:=True;
  End;
if Hata=False Then
 Val(S,Sayi,c);
End;
procedure TForm1.Button1Click(Sender: TObject);
var
hata:boolean;
sayi:integer;
begin
 strtosay(edit1.Text,sayi,Hata);
 if hata=False then
  label1.Caption:=inttostr(sayi);
 if hata=True then
  label1.Caption:='Hata';

end;
end.
YYY

z

Anladığım kadarıyla  hazır bir komut yok ve küçük program yazmak durumunda kalıyoruz.

Kafamda olupda sormadığım pek çok sorunun cevabını da verdiğiniz program örnekleri içinde buldum, ilgilenen arkadaşlara teşekkürler.

Yazdığım program 100KB hatta daha uzun bir metinde binlerce kez  numerikmi testi yapmakta bu nedenle fonksiyon yada komutun sonuca çok az zamanda ulaşmasını istiyordum.

Verdiğiniz kodlarda hızlı çalışsa da ilk fırsatta asm bir fonksiyon yazarsam hızda belirgin bir artış olacağını sanıyorum.

Bu arada delphi ile ilgili formumuz olmadığı için delphi hakkındaki sorularımızı dağınık yerlere ayrı ayrı yazmak yerine DELPHI SORULAR konusunun altına ilave edersek burada oluşacak soru-cevapları, başvuru kaynağı olarak kullanabiliriz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Salih

Haklısın arkadaşım,

Önemli olan kendi ilgilendiğimiz numerikleri test etmek,
ilgili olmayanlarla ilgilenmek gereksiz.

z

Her ne kadar bu soruyu  delphi başlığı altında sorsamda, aynı sorunla diğer görsel programlama dillerinde de karşılaşılıyor olmalı.

wordpad.exe programını delphi içinden winexec gibi bir komutla çalıştırdığımda, wordpad yeni bir pencerede karşıma geliyor.

Wordpadden çıkılıp çıkılmadığını yazdığım programdan izleyebilmek istiyorum.

Yani, program wordpadden çıkıldığı anı anlayacak ve haa adam editörü kapattı o halde edit edilmiş dosyayı compiler'a yollayayım diyecek.

Bunu nasıl yaparım?


Aslında benzer sorun windows ortamındaki batch programlarda da var.

comp.bat diye batch dosyamızın içinde aşağıdaki 2 satır olsun.

wordpad prg.asm
compile prg.asm

---------------

Yukarıdaki 2 satırlık batch dosyayı  Dos işletim sisteminde çalıştırsaydık, önce wordpad benzeri bir editor çalışırdı. Editorden çıktığımızda compile.exe devreye girer ve prg asm yi derlerdi.


Windows işletim sisteminde ise aynı batch çalıştırıldığında, Windowsda bunlar ayrı task olarak ele alındığı için wordpad.exe bir pencerede, compile.exe de bir başka pencerede açılıyor, sonuçta batch program amaca hizmet etmiyor.

Bu soruna

wordpad prg.asm
pause
compile prg.asm

şeklinde kötü bir çözüm getirsemde benim aradığım daha şık çözümler.

Ayrıca yazımın en başında mavi renkle yazdığım  soruya çözümlerinizi merak ediyorum.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

birumher

Alıntı yapılan: "bunalmis"Her ne kadar bu soruyu  delphi başlığı altında sorsamda, aynı sorunla diğer görsel programlama dillerinde de karşılaşılıyor olmalı.

wordpad.exe programını delphi içinden winexec gibi bir komutla çalıştırdığımda, wordpad yeni bir pencerede karşıma geliyor.

Wordpadden çıkılıp çıkılmadığını yazdığım programdan izleyebilmek istiyorum.

Yani, program wordpadden çıkıldığı anı anlayacak ve haa adam editörü kapattı o halde edit edilmiş dosyayı compiler'a yollayayım diyecek.

Bunu nasıl yaparım?


function WinExecAndWait32(FileName: string; Visibility: Integer): dWord;
var
 zAppName: array[0..512] of Char;
 zCurDir: array[0..255] of Char;
 WorkDir: string;
 StartupInfo: TStartupInfo;
 ProcessInfo: TProcessInformation;
begin
 StrPCopy(zAppName, FileName);
 GetDir(0, WorkDir);
 StrPCopy(zCurDir, WorkDir);
 FillChar(StartupInfo, Sizeof(StartupInfo), #0);
 StartupInfo.cb := Sizeof(StartupInfo);

 StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
 StartupInfo.wShowWindow := Visibility;
 if not CreateProcess(nil,
          zAppName, { pointer to command line string }
          nil, { pointer to process security attributes }
          nil, { pointer to thread security attributes }
          false, { handle inheritance flag }
          CREATE_NEW_CONSOLE or { creation flags }
          NORMAL_PRIORITY_CLASS,
          nil, { pointer to new environment block }
          nil, { pointer to current directory name }
          StartupInfo, { pointer to STARTUPINFO }
          ProcessInfo) then
   Result := -1 { pointer to PROCESS_INF }
 else
 begin
   WaitforSingleObject(ProcessInfo.hProcess, INFINITE);
   GetExitCodeProcess(ProcessInfo.hProcess, Result);
   CloseHandle(ProcessInfo.hProcess);
   CloseHandle(ProcessInfo.hThread);
 end;
end;
Birkan.Herguner

SpeedyX

Alıntı yapılan: "bunalmis"Bir string degisik degerler almakta, ben string iceriginin numerik
olup olmadigini anlamak istiyorum.

Istedigim bilgiyi veren hazirda bir komut varmi?

Ornegin  

S:='12A6'       numerik değil desin
S:='1256903'    numerik desin
Uzun zaman geçmiş ama sanırım sağlıklı bir cevap alınamamış.

Bu işlem için 2 sağlıklı yöntem biliyorum. 2.yöntem oldukça öğretici ve basit.
Function IsNumeric(s: String) : Boolean;
var
    Code: Integer;
    Value: Double;
begin
  val(s, Value, Code);
  Result := (Code = 0)
end;

Function IsFloat(Str_edit: string) : boolean;
var
  Int_edit   :real;
begin
  try
    Int_edit :=   StrToFloat(Str_edit);
    Result   :=   True;
  except
    Result   :=   False;
  end;
end;

IsFloat yerine isString, isInteger.... herşeyi yaparız.

Klein

trystritoint , tryinttostr , trystrtofloat , tryfloattostr  fonksiyonları ile de yapılabilir.

Analyzer

Alıntı yapılan: "Klein"trystritoint , tryinttostr , trystrtofloat , tryfloattostr  fonksiyonları ile de yapılabilir.
Selam,

Bu fonksiyonlar özel olmalı. Standart prototipde göremedim? Ayrıca çevrim sırasında exception oluşturmak çok mantıklı.

Analyzer
Üşeniyorum, öyleyse yarın!

Klein

yok özel değil. delphi help strtoint fonksiyonlarından bulabilirsiniz. ayrıca bunlar fonksiyon. geriye error döndürür.