03-02-2025, Saat: 12:33
Herkese kolaylıklar ve hayırlı kazançlar diliyorum.
Bir süredir karşılaştığım bir sorunun cevabı var mı en azından mevcut sürüm ile yapılabilecek bir çözümü var mı merak ediyorum. Delphi 10.2 Tokyo Sürümü kullanıyorum. (Lisansım dan dolayı o yüzden güncelleme şansım şu an için yok)
Sorunum şu özelikle thread ile ilgili kod yazdığımda bazen ide kaynaklı hatalardan dolayı kod çalışıyor olmasına rağmen herhangi bir yerde enter a bastığımda sanki parantez veya begin end hataları varmış, eksikmiş gibi ekleme yapıyor. Ama kodu derleyip kullanabiliyorum sorun yok sadece kod yazmamı çok zorlaştırıyor ve yazdığım kısımda çok basit ve küçük bir yer daha önce de olmuştu kodu değiştirerek bazı kısımları iptal ederek düzenlemiştim. Ama özelikle thread işlemlerinde try ..except ve try ... finally kullandığım durumlarda çok sık bu hatayı alıyorum.
Daha önce bu tarz bir hata ile karşılaşan veya çözümü konusunda bilgisi olan bir arkadaş var ise yardım rica ediyorum.
Şimdiden Herkese teşekkürlerimi sunuyorum.
Bir süredir karşılaştığım bir sorunun cevabı var mı en azından mevcut sürüm ile yapılabilecek bir çözümü var mı merak ediyorum. Delphi 10.2 Tokyo Sürümü kullanıyorum. (Lisansım dan dolayı o yüzden güncelleme şansım şu an için yok)
Sorunum şu özelikle thread ile ilgili kod yazdığımda bazen ide kaynaklı hatalardan dolayı kod çalışıyor olmasına rağmen herhangi bir yerde enter a bastığımda sanki parantez veya begin end hataları varmış, eksikmiş gibi ekleme yapıyor. Ama kodu derleyip kullanabiliyorum sorun yok sadece kod yazmamı çok zorlaştırıyor ve yazdığım kısımda çok basit ve küçük bir yer daha önce de olmuştu kodu değiştirerek bazı kısımları iptal ederek düzenlemiştim. Ama özelikle thread işlemlerinde try ..except ve try ... finally kullandığım durumlarda çok sık bu hatayı alıyorum.
procedure TmainMenu.SendDataToOtherDevice(IP: string; Port: Integer; Data: string);
begin
TTask.Run(procedure
var
Client: TIdTCPClient;
begin
// IP ve Port kontrolü
if (IP = '') or (Port <= 0) or (Port > 65535) then
begin
TThread.Synchronize(nil, procedure
begin
ShowMessage('Geçersiz IP veya Port! IP: ' + IP + ', Port: ' + IntToStr(Port));
end);
Exit; // İşlemi sonlandır
end;
Client := TIdTCPClient.Create(nil);
try
Client.Host := IP;
Client.Port := Port;
// Bağlantıyı dene
try
Client.Connect;
except
on E: Exception do
begin
TThread.Synchronize(nil, procedure
begin
ShowMessage('Bağlantı hatası: ' + E.Message + ' | IP: ' + IP + ', Port: ' + IntToStr(Port));
end);
Exit; // Hata durumunda işlemi sonlandır
end;
end;
// Veriyi gönder
Client.IOHandler.WriteLn(Data);
TThread.Synchronize(nil, procedure
begin
Memo1.Lines.Add('Sending: ' + Data + ' to ' + IP + ':' + IntToStr(Port));
end);
Client.Disconnect;
finally
Client.Free;
end;
end);
end;
procedure TmainMenu.ServerExecute(AContext: TIdContext);
begin
TTask.Run(procedure
var
ReceivedData,
TableNo,
ReceiptNo,
ClientIp,
HostIp: string;
PaymentType: smallint;
DataArray: TArray<string>;
AdoQuery: TADOQuery;
PosData: string;
begin
// COM kütüphanelerini başlat
CoInitialize(nil);
try
try
ReceivedData := AContext.Connection.IOHandler.ReadLn; // Gelen veriyi al
SplitStringData(ReceivedData, DataArray); // Veriyi parçala
if Length(DataArray) > 0 then
TableNo := DataArray[0];
if Length(DataArray) > 1 then
ReceiptNo := DataArray[1];
if Length(DataArray) > 2 then
ClientIp := DataArray[2];
if Length(DataArray) > 3 then
PaymentType := StrToInt(DataArray[3]);
// UI güncellemeleri ana thread'e iletilir
TThread.Synchronize(nil, procedure
begin
memo1.Lines.Add('Receive data: ' + ReceivedData);
memo1.Lines.Add('Table: ' + TableNo + ' | Client IP: ' + ClientIp + ' | Receipt: ' + ReceiptNo + ' | Payment Type: ' + IntToStr(PaymentType));
memo1.Lines.Add('Connection String : ' + DbDataPath);
end);
// SQL sorgusu için TADOQuery oluştur
AdoQuery := TADOQuery.Create(self);
try
AdoQuery.ConnectionString := dbDataPath ; // ADO bağlantınızı burada ayarlayın
AdoQuery.SQL.Text := ' SELECT * FROM restoran_tmp_satis WHERE fisno = ' + receiptNo ;
AdoQuery.Open;
if not AdoQuery.IsEmpty then
begin
// SQL'den gelen verileri kontrol edilip fiş kesilecek
TThread.Synchronize(nil, procedure
begin
memo1.Lines.Add('Variler okundu kontrol ediliyor : ' + PosData);
end);
end
else
begin
TThread.Synchronize(nil, procedure
begin
//ShowMessage('Fiş bulunamadı: ' + ReceiptNo);
SendDataToOtherDevice(ClientIp, 12376, 'Err!');
end);
Exit; // Fiş bulunamazsa işlemi sonlandır
end;
finally
AdoQuery.Free;
end;
// Diğer cihaza veri gönder
SendDataToOtherDevice(ClientIp, 12376, 'Ok');
TThread.Synchronize(nil, procedure
begin
memo1.Lines.Add('Send data: işlemler tamamlandı | Ok');
end);
exit;
except
on E: Exception do
begin
if adoQuery<>nil then
FreeAndNil(adoQuery) ;
TThread.Synchronize(nil, procedure
begin
ShowMessage('Hata: ' + E.Message);
end);
end;
end;
finally
// COM kütüphanelerini serbest bırak
CoUninitialize;
end;
end);
end;
Daha önce bu tarz bir hata ile karşılaşan veya çözümü konusunda bilgisi olan bir arkadaş var ise yardım rica ediyorum.
Şimdiden Herkese teşekkürlerimi sunuyorum.

