Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Nesneler arasındaki ilşkiyi/bağlantıyı tespit etmek
#1
Merhaba

Kutulardan oluşan bir makinemiz var bu makinenin her bir kutusunu ayrı açıyoruz. Lakin kullanıcı isterse kutuları birleştirip tek bir kutu gibi açmalı . Bu yüzden kullanıcının kutuları birleştirmesi için butonlardan oluşan bir form hazırladım. Her bir buton bir kutuyu temsil ediyor. bu kutuları com port ile elektronik karta komut göndererek açıyoruz. 
Her kutunun altı yada üst kutu ile beraber seçilmiş ise birleştirilebilir.

Sarı renkli olanlar birleşmesi istenen / aynı anda açılması istenen kutu kapakları. Örnekte göründüğü gibi :

1x1 , 1x2, 1x3 kutuları birleştirilmiş ve 1x1 kapağına aç komutu gönderdiğimizde üç kapak aynı anda açılacak.
[/url]1x6, 1x7 de iki kutu birleştirilmiştir. 1x6 ya komut gönderdiğimizde ikisi aynı anda açılacaktır.

1x9 butonu seçili olmasına rağmen alt yada üst kutuları seçilmediğinden birleştirilemez ve kullanıcı hata yapmış kabul edilerek görmezlikten gelinmeli.

1x12, 1x13, 1x14 kutuları arada boşluksu olduğundan birleştirilmelidir.
Bu iş için kullandığım tablo şu şekilde
[url=https://hizliresim.com/anpOm5]



Bu tabloya sutun ve satır kolonlarına birleşen kutuların ilk olanın dğerini diger kolonunada takip eden diğer kutuların sadece satır numarasını girmek istiyorum.Şöyleki:
1x1, 1x2, 1x3 birleşen kutular kümesi için kaydım şu şekild eolmalı db de SUTUN kolonuna 1 SATIR kolonuna 1 DIGER kolonuna 2 , 3 rakamları olamalı (toplam iki satırlık kayıt).

Birleşen 1x6, 1x7 kümesi için kayıt şu şekild olmalı:
SUTUN kolonu 1 SATIr kolonu 6 DIGER kolonu 7 (tek satılık kayıt)

1x9 butonu seçili olmasına rağmen alt yada üst kutu ile birlikte seçili olmadığından görmezlikten gelinmeli ve kayıt yapılmamalı.

DB e kayıt yapmak için iç içe iki for döngüsü ve
for i := 0 to (ComponentCount - 1) do
 begin
    if (Components[i] is TAdvSmoothExpanderButtonPanel) then
    begin
       for j := 0 to ((Components[i] as TAdvSmoothExpanderButtonPanel).Buttons.Count - 1) do
       begin
          if ((Components[i] as TAdvSmoothExpanderButtonPanel).Buttons[j].Color = clYellow) then
          begin

          end;
       end;


    end;
 end;

dizi ekledim ama algoritmayı bi türlü kuramadım. Sütun ve satır (kutular) n sayıdadır. İlgili fb tablosuna sadece birleşen kutuların kaydı yapılmaktadır. 
Değerli fikirlerinizi duymak isterim.
İyi Çalışmalar.

fb tablo
Cevapla
#2
Probleminizi anlamak için bir kaç defa okudum umarım yanlış anlamamışımdır.

Anladığım peş peşe en az 2 sarı buton olmalı, 1 tane olanlar göz ardı edilmeli şeklinde ise verdiğiniz kodu şu şekilde düzenleyebilirsiniz.


var
adet: intger;
ix    : integer;
 
.......
ix := 0;
adet := 0;
 
for i := 0 to (ComponentCount - 1) do
 begin
    if (Components[i] is TAdvSmoothExpanderButtonPanel) then
    begin
       for j := 0 to ((Components[i] as TAdvSmoothExpanderButtonPanel).Buttons.Count - 1) do
       begin
          if ((Components[i] as TAdvSmoothExpanderButtonPanel).Buttons[j].Color = clYellow) then
          begin
            // sarı renkli butonsa    
             if (adet = 0) then     ix := j; // sarı renkli grubun ilk buton nosu
              
             adet := adet + 1; // grupdaki sarı butonları sayıyoruz
             
             
          end
          else
          begin
            // farklı renkli ise
             if (adet > 1) then // peş peşe en az 2 sarı olması şartı kontrol ediliyor
             begin
              // ix de sarı renkli grubun ilk buton nosu
              // adet de grupda kaçtane sarı renk olduğu bilgisi var
              // kontrol ve/veya db işlemlerinizi burada yapabilirsiniz.        
             end;
             
             adet := 0; // bir sonraki sarı grubu saymak için sayacımızı sıfırlıyoruz
             
         end;
       end;
  
  
    end;
 end;
 
 
 // ---- EKLEME ----
 // yukarıdaki kontrol mekanizması sarıdan sonra en az bir farklı renk gelme durumlarını kontrol ediyor.
 // son grup sarı ile bitiyorsa bu grup yukarıdaki else içerisinde kontrol edilmeyecektir.
 // bu  durumu  döngü sonunda adet değişkeninin değerine göre aşağıda kontrol ediyoruz.
 if (adet > 1) then
 begin
              // ix de sarı renkli grubun ilk buton nosu
              // adet de grupda kaçtane sarı renk olduğu bilgisi var
              // kontrol ve/veya db işlemlerinizi burada yapabilirsiniz.     
 end;
 

Cevapla
#3
Cevabınız için teşekkürler . Amaç ardışık iki sarı butonu db e kaydetmek.
Bende şu şekilde bi şeyler yazdım çalıştı ama çok karışık oldu.

procedure TfrmRafBirlestir.btnKaydetClick(Sender: TObject);
var
i,j,k:integer;
Dizi :array[1..100] of Integer;
ilk_kutu,son_kutu:Integer;
sSutun,sSatir,sDiger:Integer;
yer:Integer;
Secilmis:Boolean;
begin
ilk_kutu:= -1;
son_kutu:= -1;
Secilmis:=false;
try
 with DataModule1.qrSil do
 begin
   close;
   sql.Clear;
   sql.Add('DELETE FROM BIRLESMIS');
   ExecSQL;
 end;
 for i := 0 to (ComponentCount - 1) do
 begin
    if (Components[i] is TAdvSmoothExpanderButtonPanel) then
    begin
       for j := 0 to ((Components[i] as TAdvSmoothExpanderButtonPanel).Buttons.Count - 1) do
       begin
          if ((Components[i] as TAdvSmoothExpanderButtonPanel).Buttons[j].Color = clYellow) then
          begin     //son kutu değilse
            if not (j = (Components[i] as TAdvSmoothExpanderButtonPanel).Buttons.Count - 1) then
             begin //sonraki ardışık kutu sarı renkte ise  (seçilmiş)
                if ((Components[i] as TAdvSmoothExpanderButtonPanel).Buttons[j].Color = clYellow) then
                 begin  //dsha önce kutu seçilmemişse

                   if (secilmis = false) then //(ilk_kutu = -1) then
                   begin
                    ilk_kutu:= j ; //seçili kutu
                    yer:=pos('x',(Components[i] as TAdvSmoothExpanderButtonPanel).Buttons[j].Caption);
                    sSutun:=strtoint( Copy((Components[i] as TAdvSmoothExpanderButtonPanel).Buttons[j].Caption,0,yer-1));
                    sSatir:=strtoint(Copy((Components[i] as TAdvSmoothExpanderButtonPanel).Buttons[j].Caption ,yer+1,length((Components[i] as TAdvSmoothExpanderButtonPanel).Buttons[j].Caption)));
                   end;
                   Secilmis:=true;
                    //ardışık kutu da sarı renkte seçilmişse ilk kutu seçilmişse
                   if  (secilmis = true) and ((Components[i] as TAdvSmoothExpanderButtonPanel).Buttons[j+1].Color = clYellow) then //başlangıç noktası varsa sonraki butonda sarı ise
                   begin
                    son_kutu:= j + 1;
                    yer:=pos('x',(Components[i] as TAdvSmoothExpanderButtonPanel).Buttons[j+1].Caption);
                    sDiger:=strtoint(Copy((Components[i] as TAdvSmoothExpanderButtonPanel).Buttons[j+1].Caption,yer+1,length((Components[i] as TAdvSmoothExpanderButtonPanel).Buttons[j+1].Caption)));

                     with DataModule1 do
                     begin
                       tblBirlesmis.Active:=true;
                       tblBirlesmis.Insert;
                       tblBirlesmisSUTUN.Value:=sSutun;
                       tblBirlesmisSATIR.Value:=sSatir;
                       tblBirlesmisDIGER.Value:=sDiger;
                       tblBirlesmis.Post;
                     end;

                                     //seçili kutular ardışıksa grupla kaydet

                 end else begin //kutu seçili değilse
                   //burası fazladan    hatalı
                   secilmis:=false;

                 end;
                 end;

             end;

          end;
       end;


    end;
    ilk_kutu:=-1;
    son_kutu:=-1;
    Secilmis:=false;
 end;

except on E: Exception do
 ShowMessage(e.Message);
end;
end;





db

ekran
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Nesneler arası İlişkisel bağlantı yapmak bydelphi 2 337 30-06-2020, Saat: 11:08
Son Yorum: bydelphi
  Aynı Türden Nesneler MugenPower 2 310 23-06-2020, Saat: 09:11
Son Yorum: DelphiCan
  ISNULL değeri kontrol etmek OZCANK 7 814 25-05-2020, Saat: 20:41
Son Yorum: ihalilcoban
  Kalıtılmış Formu Değişkende Tutarak Dinamik Create Etmek LastCoder 6 1.431 14-10-2019, Saat: 12:11
Son Yorum: sadettinpolat
  Json Free Etmek yhackup 4 1.580 31-07-2019, Saat: 11:17
Son Yorum: Halil Han BADEM



Konuyu Okuyanlar: 1 Ziyaretçi