FindComponent i Access Violation

0

Witam,
W pętli for (gdzie inkrementowana zmienna to i) mam taki oto kod:

TempCombo := TComboBox(FindComponent('ComboBox' + IntToStr(i)));
TempCombo.ItemIndex := i;

Podczas uruchomienia programu debugger wywala błąd:
'access violation at 0x0083aa8f: read of address 0x00000000'
Zdaję sobie sprawę, że tego typu crash jest zazwyczaj spowodowany odwołaniem się do obszaru pamięci do której nie mamy w danym momencie prawa się odwoływać, poprzez np. odwołania do nie istniejących jeszcze tworzonych dynamicznie obiektów itp. Tutaj natomiast TempCombo jest tworzony wcześniej dynamicznie (lub też nawet gdy jest na sztywno wrzucony na formę dalej jest problem). A i najważniejsze błąd wyskakuje dopiero przy drugiej linijce tj. gdzie ustawiane jest ItemIndex. Why?

0

Bo funkcja FindComponent prawdopodobnie nie znalazła takiego komponentu i zwróciła adres 0x0, więc przypisałeś TempCombo adres 0x0, potem chcesz odwołać się do tej kontrolki no to wiesz co się stanie. I to czy TempCombo było wcześniej utworzone czy nie, nie ma tutaj znaczenia, bo ty ponownie przypisujesz.

0

U mnie kod działa.
Na pewno masz komponent o odpowiedniej nazwie na formie?
Tak jak powiedział @xeo545x39 - AV możesz dostać, gdy komponent nie zostaje odnaleziony.

A i najważniejsze błąd wyskakuje dopiero przy drugiej linijce tj. gdzie ustawiane jest ItemIndex. Why?

Jeżeli FindComponent zwróciło nil, TempCombo także będzie wskazywać na nil (nil = Pointer(0)).
Odczytujesz/zapisujesz zawartość pamięci znajdującą się pod adresem Pointer(0), przez co otrzymujesz AV.

0
Patryk27 napisał(a):

U mnie kod działa.
Na pewno masz komponent o odpowiedniej nazwie na formie?
Tak jak powiedział @xeo545x39 - AV możesz dostać, gdy komponent nie zostaje odnaleziony.

Komponent ComboBox1 na pewno jest na formie, podejrzewam, że problemem może być to, iż nie jest on na niej umiejscowiony bezpośrednio, a jest zaszyty "głębiej" tj. Form.PageControl.TabSheet.GroupBox . W jaki sposób mogę sprawdzić co znalazła metoda FindComponent?

0

W jaki sposób mogę sprawdzić co znalazła metoda FindComponent?

FindComponent zwraca TComponent.
Wystarczy sprawdzić, czy nie zwróciło nil (służy do tego funkcja assigned).
Jeżeli Assigned(wynik funkcji) = true, wtedy możesz operować na tym komponencie (czyli został on odnaleziony).

podejrzewam, że problemem może być to, iż nie jest on na niej umiejscowiony bezpośrednio, a jest zaszyty "głębiej" tj. Form.PageControl.TabSheet.GroupBox

U mnie pomimo tego, komponent jest wykrywany (Delphi 7).

0

Bezpieczniejszy kod powinien wyglądqać tak:

var
  TempCombo: TComponent;
  i: Integer;
begin
  //tu gdzies nadac i wartosc 
  TempCombo:= FindComponent('ComboBox' + IntToStr(i));
  if {Assigned(TempCombo) and} (TempCombo is TComboBox) then //sprawdzenie Assigned niepotrzebne bo ten kod sprawdzi czy nie nil
  begin
    TComboBox(TempCombo).ItemIndex:= i;
    //tu jakies inne operacja
  end;
end;
0

Faktycznie,

if Assigned(TempCombo)  then

zwraca FALSE

, może to jednak kwestia tego głębszego zaszycia?
0
Lakshmi napisał(a):

może to jednak kwestia tego głębszego zaszycia?
Nie FindComponent (w przeciwieństwie do FindControl które wyszukuje tylko kontrolki potomne danego rodzica) działa globalnie na całą Formę (nie na projekt).

Sprawdź czy na pewno i ma nadaną odpowiednią wartość.

0

Wystarczy sprawdzić, czy nie zwróciło nil (służy do tego funkcja assigned).
Jeżeli Assigned(wynik funkcji) = true, wtedy możesz operować na tym komponencie (czyli został on odnaleziony).

Może i się czepiam ale można debuggerem podejrzeć wartość TempCombo (Ctrl+F7 w Lazarusie) zamiast mieszać sobie w kodzie. Zaawansowane techniki debuggerskie FTW.

może to jednak kwestia tego głębszego zaszycia?

Może pokaż więcej kodu. Nie wróżymy z fusów.

0

Na pewno ComboBox1 jest na formie i ma taką nazwę (zresztą są comboboxy o nazwach od combobox1 do combobox8). Najlepsze jest to, że niżej w kodzie wykonuję operacje wykorzystując FindComponent i działa ok. Niżej cała procedurka, bo już mi pomysły się kończą...

procedure TForm1.UstawWyswietlaneWilg;
var
  INIwilgotnosci          : TINIFile;
  sKoks                   : String;
  i,j,iIloscKoksowWBazie  : Byte;
  oDBComboBox             : TDBComboBox;
  dzien                   : TDate;
  Listakoksow             : TStringList;
  ComboBox, TempCombo     : TComboBox;
begin
  if not FileExists(ExtractFilePath(Application.ExeName) + 'RapRob\Wilgotnosci.ini') then begin
    try
      INIwilgotnosci := TINIFile.Create(ExtractFilePath(Application.ExeName) + 'RapRob\Wilgotnosci.ini');
    except
      on E:Exception do begin
        komunikat := 'Błąd utworzenia nowego pliku INI z ustawieniami początkowymi wyśliwetlanych wilgotności koksów';
        WstawKomunikat;
        ZapiszKomunikat;
         { TODO : Dorobić obsługę wyświetlania nazw wilgotności koksów w przypadku błędu utworzenia pliku INI }
      end;
    end;

    with DataModule1.dbqRzMat do begin
      if Active = TRUE then
        Close;

      Sql.Clear;
      Sql.Add('SELECT nazwa FROM dbo.bf_rapzm_mat ');
      Sql.Add('WHERE kod_stos = ''K'' ');
      Sql.Add('ORDER BY nazwa');
      Open;
      iIloscKoksowWBazie := RecordCount;

      //Utworzenie sekcji 'Koksy' w pliku INI (alfabetyczny spis koksów istniejących w bazie)
      First;
      Listakoksow := TStringList.Create();
      for i := 1 to iIloscKoksowWBazie do begin
        sKoks := FieldByName('nazwa').AsString;
        ListaKoksow.Add('sKoks');
        INIwilgotnosci.WriteString('Koksy', 'Koks' + IntToStr(i), sKoks);
        Next;
      end;

      //Utworzenie sekcji 'Wybrane' w pliku INI
      TempCombo := TComboBox.Create(nil);
      for i := 1 to 8 do begin
        INIwilgotnosci.WriteString('Wybrane', IntToStr(i), IntToStr(i));
//        TComboBox(FindComponent('ComboBox' + IntToStr(i))).ItemIndex := i;

        TempCombo   := TComboBox(FindComponent('ComboBox' + IntToStr(i)));
//        ComboBox.Items      := Listakoksow;
        if Assigned(TempCombo) then
          TempCombo.ItemIndex  := i;
      end;

      ListaKoksow.Free;
      Close;
    end;
  end else begin  //plik INI już istnieje
    INIwilgotnosci := TINIFile.Create(ExtractFilePath(Application.ExeName) + 'RapRob\Wilgotnosci.ini');
    try
      for i := 1 to 8 do begin
        sKoks := INIwilgotnosci.ReadString('Main', 'Koks' + IntToStr(i), 'Koks' + IntToStr(i));
//        TDBComboBox(FindComponent('DBComboBox1' + IntToStr(i))).Text := sKoks;
        TComboBox(FindComponent('ComboBox' + IntToStr(i))).Text := sKoks;
//        TComboBox(FindComponent('ComboBox' + IntToStr(i))).ItemIndex := 2;
      end;
    finally
      INIwilgotnosci.Free;
    end;
  end;

  WstawDatyDoStringGridDatyWilg(Date);
end;
0

Zmień:

TempCombo := TComboBox.Create(nil);

na:

TempCombo := TComboBox.Create(Form1);

A zresztą co to jest? Ta pętla tworzy 1 ComboBox

      //Utworzenie sekcji 'Wybrane' w pliku INI
      TempCombo := TComboBox.Create(nil);
      for i := 1 to 8 do begin
        INIwilgotnosci.WriteString('Wybrane', IntToStr(i), IntToStr(i));
//        TComboBox(FindComponent('ComboBox' + IntToStr(i))).ItemIndex := i;
 
        TempCombo   := TComboBox(FindComponent('ComboBox' + IntToStr(i)));
//        ComboBox.Items      := Listakoksow;
        if Assigned(TempCombo) then
          TempCombo.ItemIndex  := i;
      end;

Nie wiem co to ma być ale skoro komponenty ComboBox są położone na formie (czy tam na jakimś panelu czy nie wiadomo czym) to po co:

TempCombo := TComboBox.Create(nil);
0

TempCombo := TComboBox.Create(nil);

Bo?

kAzek napisał(a):

Zmień:

TempCombo := TComboBox.Create(nil);

na:

TempCombo := TComboBox.Create(Form1);

Po co tworzyć nowy TempCombo?!?! Przecież i tak traci referencję do niego.

Może jakbyś pokazał to jak wygląda deklaracja TForm1 to byśmy wreszcie wiedzieli jak wyglądają te comboboxy.
Możesz też zamiast FindComponent użyć zwykłej tablicy z kolejnymi ComboBox, proste i działa.

0

Deklaracja TForm1, UWAGA trochę przydługawa :) :

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    StatusBar1: TStatusBar;
    PageControl1: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    TabSheet3: TTabSheet;
    TabSheet4: TTabSheet;
    Panel3: TPanel;
    GroupBox1: TGroupBox;
    StringGrid1: TStringGrid;
    Shape2: TShape;
    Shape3: TShape;
    Button1: TButton;
    Label2: TLabel;
    Label3: TLabel;
    Shape4: TShape;
    Shape5: TShape;
    Label4: TLabel;
    Label5: TLabel;
    ColorDialog1: TColorDialog;
    StringGrid3: TStringGrid;
    StringGrid2: TStringGrid;
    Shape6: TShape;
    Shape7: TShape;
    Shape8: TShape;
    Shape9: TShape;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Shape10: TShape;
    Label10: TLabel;
    Panel4: TPanel;
    Panel5: TPanel;
    Label13: TLabel;
    Label14: TLabel;
    Shape11: TShape;
    GroupBox2: TGroupBox;
    Label16: TLabel;
    GroupBox4: TGroupBox;
    GroupBox3: TGroupBox;
    Shape14: TShape;
    StringGrid9: TStringGrid;
    StringGrid10: TStringGrid;
    Label17: TLabel;
    StringGrid11: TStringGrid;
    StringGrid13: TStringGrid;
    StringGrid14: TStringGrid;
    StringGrid15: TStringGrid;
    StringGrid16: TStringGrid;
    StringGrid17: TStringGrid;
    StringGrid18: TStringGrid;
    Shape15: TShape;
    Shape16: TShape;
    Shape17: TShape;
    Label18: TLabel;
    Label19: TLabel;
    Label20: TLabel;
    Shape18: TShape;
    Label21: TLabel;
    Shape19: TShape;
    Label22: TLabel;
    Shape20: TShape;
    Label23: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Label24: TLabel;
    Shape23: TShape;
    Label26: TLabel;
    Shape24: TShape;
    Label27: TLabel;
    Shape25: TShape;
    Label28: TLabel;
    Shape28: TShape;
    Label31: TLabel;
    Shape29: TShape;
    Label32: TLabel;
    Edit7: TEdit;
    Panel6: TPanel;
    GroupBox5: TGroupBox;
    GroupBox6: TGroupBox;
    Label33: TLabel;
    Label34: TLabel;
    Label35: TLabel;
    Label36: TLabel;
    Label37: TLabel;
    Label38: TLabel;
    Shape30: TShape;
    Label39: TLabel;
    Shape31: TShape;
    Label40: TLabel;
    GroupBox7: TGroupBox;
    Shape32: TShape;
    Label41: TLabel;
    Shape33: TShape;
    Label42: TLabel;
    Shape34: TShape;
    Label43: TLabel;
    Shape35: TShape;
    Label44: TLabel;
    Shape36: TShape;
    Label49: TLabel;
    DBGrid1: TDBGrid;
    SpinEdit2: TSpinEdit;
    ListBox1: TListBox;
    SpinEdit4: TSpinEdit;
    DBGrid3: TDBGrid;
    RichEdit1: TRichEdit;
    StringGrid12: TStringGrid;
    DBGrid2: TDBGrid;
    Label50: TLabel;
    SaveDialog1: TSaveDialog;
    QRTextFilter1: TQRTextFilter;
    GroupBox8: TGroupBox;
    DateTimePicker1: TDateTimePicker;
    SpinEdit1: TSpinEdit;
    TimerPom: TTimer;
    TimerSpuSpi: TTimer;
    TimerKaty: TTimer;
    TimerCzas: TTimer;
    MainMenu1: TMainMenu;
    Aktywacja1: TMenuItem;
    Wymiana1: TMenuItem;
    Przegladanie1: TMenuItem;
    Uruchom1: TMenuItem;
    Aktualizuj1: TMenuItem;
    Koniec1: TMenuItem;
    Popzmiana1: TMenuItem;
    Dowolnazmiana1: TMenuItem;
    Podgldraportu1: TMenuItem;
    Drukuj1stron1: TMenuItem;
    Drukuj2stron1: TMenuItem;
    Zamknijraport1: TMenuItem;
    Biezmiana1: TMenuItem;
    OpenDialog1: TOpenDialog;
    Nastzmiana1: TMenuItem;
    SpinEdit6: TSpinEdit;
    Poczpostoju1: TMenuItem;
    Koniecpostoju1: TMenuItem;
    GroupBox9: TGroupBox;
    ListBox2: TListBox;
    TimerConect: TTimer;
    DBGrid4: TDBGrid;
    SpinEdit7: TSpinEdit;
    SpinEdit8: TSpinEdit;
    SpinEdit10: TSpinEdit;
    StartAbsolutny: TMenuItem;
    Kontynuacja: TMenuItem;
    DBText1: TDBText;
    DBText2: TDBText;
    DBText3: TDBText;
    StringGrid4: TStringGrid;
    WstawPostoj: TBitBtn;
    Label56: TLabel;
    Label11: TLabel;
    Shape12: TShape;
    DBGrid5: TDBGrid;
    DBGrid6: TDBGrid;
    DBGrid7: TDBGrid;
    DBGrid8: TDBGrid;
    DBGrid9: TDBGrid;
    DBGrid12: TDBGrid;
    DBGrid13: TDBGrid;
    Shape13: TShape;
    Label12: TLabel;
    DBGrid14: TDBGrid;
    DBGrid10: TDBGrid;
    StringGrid25: TStringGrid;
    StringGrid26: TStringGrid;
    Shape26: TShape;
    Label15: TLabel;
    Shape27: TShape;
    Label29: TLabel;
    Shape37: TShape;
    Label30: TLabel;
    Shape38: TShape;
    Label54: TLabel;
    Shape39: TShape;
    Label55: TLabel;
    DBGrid15: TDBGrid;
    DBGrid16: TDBGrid;
    StringGrid28: TStringGrid;
    StringGrid29: TStringGrid;
    DBMemo1: TDBMemo;
    DBMemo2: TDBMemo;
    DBMemo3: TDBMemo;
    DBMemo4: TDBMemo;
    DBMemo5: TDBMemo;
    DBComboBox1: TDBComboBox;
    DBComboBox2: TDBComboBox;
    DBComboBox3: TDBComboBox;
    DBComboBox4: TDBComboBox;
    DBComboBox5: TDBComboBox;
    DBComboBox6: TDBComboBox;
    DBComboBox7: TDBComboBox;
    DBComboBox8: TDBComboBox;
    DBComboBox9: TDBComboBox;
    DBComboBox10: TDBComboBox;
    UsunPostoj: TBitBtn;
    ZapiszPostoj: TBitBtn;
    WstawAnalSp: TBitBtn;
    ZapiszAnalSp: TBitBtn;
    UsunAnalSp: TBitBtn;
    WstawSitSp: TBitBtn;
    ZapiszSitSp: TBitBtn;
    UsunSitSp: TBitBtn;
    WstawSitKok: TBitBtn;
    ZapiszSitKok: TBitBtn;
    UsunSitKok: TBitBtn;
    WstawAnalKk: TBitBtn;
    ZapiszAnalKk: TBitBtn;
    UsunAnalKk: TBitBtn;
    WstawPyl: TBitBtn;
    ZapiszPyl: TBitBtn;
    UsunPyl: TBitBtn;
    WstawKoksDod: TBitBtn;
    ZapiszKoksDod: TBitBtn;
    UsunKoksDod: TBitBtn;
    ZapiszPomiar: TBitBtn;
    ZapiszPom2: TBitBtn;
    ZapiszPom3: TBitBtn;
    WstawStrefe: TBitBtn;
    ZapiszStrefe: TBitBtn;
    UsunStrefe: TBitBtn;
    WstawZapasy: TBitBtn;
    ZapiszZapasy: TBitBtn;
    UsunZapasy: TBitBtn;
    ZapiszSpust: TBitBtn;
    ZapiszSpust2: TBitBtn;
    ZapiszSpust3: TBitBtn;
    WstawNaboj: TBitBtn;
    ZapiszNaboj: TBitBtn;
    UsunNaboj: TBitBtn;
    WstawMat: TBitBtn;
    ListBox3: TListBox;
    ZapiszSyst: TBitBtn;
    Edit3: TEdit;
    Edit4: TEdit;
    RichEdit2: TRichEdit;
    RichEdit3: TRichEdit;
    DBGrid18: TDBGrid;
    ZapiszDysze: TBitBtn;
    Bevel3: TBevel;
    TabSheet5: TTabSheet;
    GroupBox10: TGroupBox;
    ListBox4: TListBox;
    Button2: TButton;
    DateTimePicker2: TDateTimePicker;
    SpinEdit5: TSpinEdit;
    RichEdit4: TRichEdit;
    GroupBox11: TGroupBox;
    PrzyciskPopZm: TBitBtn;
    PrzyciskNastZm: TBitBtn;
    GroupBox12: TGroupBox;
    RichEdit5: TRichEdit;
    GroupBox13: TGroupBox;
    StartAbsKont: TBitBtn;
    StartAbsRezyg: TBitBtn;
    Panel8: TPanel;
    Label51: TLabel;
    Label52: TLabel;
    Edit5: TEdit;
    Edit6: TEdit;
    Label57: TLabel;
    DateTimePicker3: TDateTimePicker;
    DateTimePicker4: TDateTimePicker;
    GroupBox14: TGroupBox;
    Label1: TLabel;
    SpinEdit3: TSpinEdit;
    PrzyciskKontynuacja: TBitBtn;
    GroupBox15: TGroupBox;
    Shape1: TShape;
    Label58: TLabel;
    WstawMedium: TBitBtn;
    ZapiszMedium: TBitBtn;
    UsunMedium: TBitBtn;
    DBGrid17: TDBGrid;
    GroupBox16: TGroupBox;
    Shape21: TShape;
    Label59: TLabel;
    WstawBilMat: TBitBtn;
    ZapiszBilMat: TBitBtn;
    UsunBilMat: TBitBtn;
    DBGrid19: TDBGrid;
    TimerBil: TTimer;
    GroupBox17: TGroupBox;
    DBGrid20: TDBGrid;
    Memo1: TMemo;
    Shape22: TShape;
    Label60: TLabel;
    WstawObsade: TBitBtn;
    ZapiszObsade: TBitBtn;
    UsunObsade: TBitBtn;
    GroupBox18: TGroupBox;
    Shape40: TShape;
    Label61: TLabel;
    DBGrid21: TDBGrid;
    Memo2: TMemo;
    WstawMaterial: TBitBtn;
    ZapiszMaterial: TBitBtn;
    UsunMaterial: TBitBtn;
    Ustawienia1: TMenuItem;
    ZmianaGazu: TMenuItem;
    AnalizySpieku: TMenuItem;
    SredniceDysz: TMenuItem;
    TablicaObsad: TMenuItem;
    TablicaMas: TMenuItem;
    GroupBox19: TGroupBox;
    DBGrid22: TDBGrid;
    Shape41: TShape;
    Label62: TLabel;
    ZapiszAktAnal: TBitBtn;
    AktAnalChem: TMenuItem;
    Edit11: TEdit;
    Edit12: TEdit;
    Edit13: TEdit;
    Edit14: TEdit;
    Edit15: TEdit;
    Edit16: TEdit;
    Edit17: TEdit;
    Edit18: TEdit;
    Edit9: TEdit;
    GroupBox20: TGroupBox;
    ListBox5: TListBox;
    DBGrid23: TDBGrid;
    DBGrid24: TDBGrid;
    ZapiszInfo: TBitBtn;
    ZapiszUwUrz: TBitBtn;
    ZapiszZmKon: TBitBtn;
    ZapiszZmPrz: TBitBtn;
    ZapiszUwKier: TBitBtn;
    Label45: TLabel;
    Label46: TLabel;
    Bevel1: TBevel;
    Label47: TLabel;
    Label48: TLabel;
    Bevel2: TBevel;
    QRCompositeReport1: TQRCompositeReport;
    DalejUruchom: TBitBtn;
    TimerUruch: TTimer;
    PanelStale: TPanel;
    GroupBox21: TGroupBox;
    Label53: TLabel;
    SpinEdit9: TSpinEdit;
    TabSheet6: TTabSheet;
    GroupBox22: TGroupBox;
    StringGrid5: TStringGrid;
    Shape42: TShape;
    Shape43: TShape;
    Shape44: TShape;
    Shape45: TShape;
    Label63: TLabel;
    Label64: TLabel;
    Label65: TLabel;
    Label66: TLabel;
    DBGrid25: TDBGrid;
    ZapiszWilgotnosci: TBitBtn;
    Shape46: TShape;
    Shape47: TShape;
    Label67: TLabel;
    Label68: TLabel;
    Shape48: TShape;
    Label69: TLabel;
    Shape50: TShape;
    Label71: TLabel;
    WstawWilgKoksu: TBitBtn;
    StringGrid24: TStringGrid;
    DBGrid11: TDBGrid;
    Panel7: TPanel;
    Label25: TLabel;
    DBEdit1: TDBEdit;
    DBEdit2: TDBEdit;
    DBEdit3: TDBEdit;
    DBEdit4: TDBEdit;
    DBEdit5: TDBEdit;
    StringGrid6: TStringGrid;
    BindingsList1: TBindingsList;
    StringGrid7: TStringGrid;
    StringGrid8: TStringGrid;
    StringGridDatyWilg: TStringGrid;
    ScrollBar1: TScrollBar;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    ComboBox3: TComboBox;
    ComboBox4: TComboBox;
    ComboBox5: TComboBox;
    ComboBox6: TComboBox;
    ComboBox7: TComboBox;
    ComboBox8: TComboBox;
    procedure PanelStaleDblClick(Sender: TObject);
    procedure TimerUruchTimer(Sender: TObject);
    procedure DalejUruchomClick(Sender: TObject);
    procedure QRCompositeReport1AddReports(Sender: TObject);
    procedure ZapiszInfoClick(Sender: TObject);
    procedure DBGrid24DblClick(Sender: TObject);
    procedure DBGrid23CellClick(Column: TColumn);
    procedure ListBox5DblClick(Sender: TObject);
    procedure AktAnalChemClick(Sender: TObject);
    procedure ZapiszAktAnalClick(Sender: TObject);
    procedure Label16DblClick(Sender: TObject);
    procedure ZmianaGazuClick(Sender: TObject);
    procedure TablicaMasClick(Sender: TObject);
    procedure TablicaObsadClick(Sender: TObject);
    procedure SredniceDyszClick(Sender: TObject);
    procedure AnalizySpiekuClick(Sender: TObject);
    procedure DBGrid21KeyPress(Sender: TObject; var Key: Char);
    procedure GroupBox18DblClick(Sender: TObject);
    procedure UsunMaterialClick(Sender: TObject);
    procedure ZapiszMaterialClick(Sender: TObject);
    procedure WstawMaterialClick(Sender: TObject);
    procedure Label55DblClick(Sender: TObject);
    procedure DBGrid20KeyPress(Sender: TObject; var Key: Char);
    procedure GroupBox17DblClick(Sender: TObject);
    procedure UsunObsadeClick(Sender: TObject);
    procedure ZapiszObsadeClick(Sender: TObject);
    procedure WstawObsadeClick(Sender: TObject);
    procedure GroupBox6DblClick(Sender: TObject);
    procedure TimerBilTimer(Sender: TObject);
    procedure UsunBilMatClick(Sender: TObject);
    procedure ZapiszBilMatClick(Sender: TObject);
    procedure WstawBilMatClick(Sender: TObject);
    procedure UsunMediumClick(Sender: TObject);
    procedure ZapiszMediumClick(Sender: TObject);
    procedure WstawMediumClick(Sender: TObject);
    procedure PrzyciskKontynuacjaClick(Sender: TObject);
    procedure StartAbsKontClick(Sender: TObject);
    procedure StartAbsRezygClick(Sender: TObject);
    procedure DBGrid11KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure Label5DblClick(Sender: TObject);
    procedure ZapiszDyszeClick(Sender: TObject);
    procedure ZapiszSystClick(Sender: TObject);
    procedure WstawMatClick(Sender: TObject);
    procedure DBGrid7CellClick(Column: TColumn);
    procedure UsunNabojClick(Sender: TObject);
    procedure ZapiszNabojClick(Sender: TObject);
    procedure WstawNabojClick(Sender: TObject);
    procedure DBGrid10DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGrid8DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGrid5DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGrid6DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGrid14DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGrid9DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGrid7DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure DBGrid13CellClick(Column: TColumn);
    procedure ZapiszSpust3Click(Sender: TObject);
    procedure DBGrid11CellClick(Column: TColumn);
    procedure DBGrid1CellClick(Column: TColumn);
    procedure ZapiszSpustClick(Sender: TObject);
    procedure DBGrid16CellClick(Column: TColumn);
    procedure UsunZapasyClick(Sender: TObject);
    procedure ZapiszZapasyClick(Sender: TObject);
    procedure WstawZapasyClick(Sender: TObject);
    procedure UsunStrefeClick(Sender: TObject);
    procedure ZapiszStrefeClick(Sender: TObject);
    procedure WstawStrefeClick(Sender: TObject);
    procedure DBGrid15CellClick(Column: TColumn);
    procedure DBGrid14CellClick(Column: TColumn);
    procedure UsunPylClick(Sender: TObject);
    procedure ZapiszPylClick(Sender: TObject);
    procedure WstawPylClick(Sender: TObject);
    procedure DBGrid4CellClick(Column: TColumn);
    procedure ZapiszPomiarClick(Sender: TObject);
    procedure DBGrid9CellClick(Column: TColumn);
    procedure UsunKoksDodClick(Sender: TObject);
    procedure ZapiszKoksDodClick(Sender: TObject);
    procedure WstawKoksDodClick(Sender: TObject);
    procedure DBGrid10CellClick(Column: TColumn);
    procedure UsunAnalKkClick(Sender: TObject);
    procedure ZapiszAnalKkClick(Sender: TObject);
    procedure WstawAnalKkClick(Sender: TObject);
    procedure DBGrid8CellClick(Column: TColumn);
    procedure UsunSitKokClick(Sender: TObject);
    procedure ZapiszSitKokClick(Sender: TObject);
    procedure WstawSitKokClick(Sender: TObject);
    procedure DBGrid6CellClick(Column: TColumn);
    procedure UsunSitSpClick(Sender: TObject);
    procedure ZapiszSitSpClick(Sender: TObject);
    procedure WstawSitSpClick(Sender: TObject);
    procedure DBGrid5CellClick(Column: TColumn);
    procedure UsunAnalSpClick(Sender: TObject);
    procedure ZapiszAnalSpClick(Sender: TObject);
    procedure WstawAnalSpClick(Sender: TObject);
    procedure ZapiszPostojClick(Sender: TObject);
    procedure UsunPostojClick(Sender: TObject);
//    procedure DBMemo1Change(Sender: TObject);
    procedure DBComboBox1DropDown(Sender: TObject);
    procedure DBComboBox1Change(Sender: TObject);
    procedure StringGrid29DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure StringGrid28DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure StringGrid26DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure StringGrid25DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure StringGrid24DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure WstawPostojClick(Sender: TObject);
    procedure StringGrid4DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure DBGrid4DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure KontynuacjaClick(Sender: TObject);
    procedure StartAbsolutnyClick(Sender: TObject);
    procedure StringGrid10DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure TimerConectTimer(Sender: TObject);
    procedure Panel6Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure StringGrid3DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure StringGrid9DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure Label18DblClick(Sender: TObject);
    procedure StringGrid10KeyPress(Sender: TObject; var Key: Char);
    procedure StringGrid11KeyPress(Sender: TObject; var Key: Char);
    procedure Label50DblClick(Sender: TObject);
    procedure TabSheet2Show(Sender: TObject);
    procedure Panel4Click(Sender: TObject);
    procedure TimerPomTimer(Sender: TObject);
    procedure TimerSpuSpiTimer(Sender: TObject);
    procedure TimerKatyTimer(Sender: TObject);
    procedure TimerCzasTimer(Sender: TObject);
    procedure Aktualizuj1Click(Sender: TObject);
    procedure Poczpostoju1Click(Sender: TObject);
    procedure Koniecpostoju1Click(Sender: TObject);
    procedure Koniec1Click(Sender: TObject);
    procedure Podgldraportu1Click(Sender: TObject);
    procedure Popzmiana1Click(Sender: TObject);
    procedure Dowolnazmiana1Click(Sender: TObject);
    procedure Biezmiana1Click(Sender: TObject);
    procedure Nastzmiana1Click(Sender: TObject);
    procedure Drukuj1stron1Click(Sender: TObject);
    procedure Drukuj2stron1Click(Sender: TObject);
    procedure Zamknijraport1Click(Sender: TObject);
    procedure AppException(Sender: TObject; E: Exception);
    procedure StringGrid5DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    procedure ZapiszWilgotnosciClick(Sender: TObject);
    procedure StringGrid9MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure StringGrid9MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure WstawWilgKoksuClick(Sender: TObject);
    procedure ScrollBar1Change(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure ComboBox1DropDown(Sender: TObject);
  private
    { Private declarations }
    procedure Nagl(StrGrid  : TStringGrid; Text : string; Rec :TRect);
    procedure NagTab(Shape :TShape; Grid :TStringGrid; ColF,ColL  :Integer;
                        Lab  :TLabel);
    procedure SzerTab(dbGrid :TDBGrid; Grid :TStringGrid; PraOgr  :Integer);
//    procedure LiczDane(czas  : TDateTime);
    procedure StartKontynuacja(step  : integer);
    procedure KrokObliczen(time  : TDateTime);
    procedure ZapiszStanDyszy(czas  : TDateTime; raportID  : Integer);
    procedure WstawPomGodz(czas  : TDateTime; raportID  : Integer);
    procedure WstawPomChwil(czas  : TDateTime);
    procedure Zaladunek(czas  : TDateTime; raportID, zmn  : Integer);
    procedure Katy(czas  : TDateTime);
    procedure WstawAnalizyChem(czas  : TDateTime);
    procedure SredniSpiekTasm(raportID  : Integer);
    procedure UstawStanAnalizy(raportID,stan :Integer; rodz :string);
    procedure WstawSpustyPocz(czas  : TDateTime);
    procedure WstawSpustyZuzel(czas  : TDateTime);
    procedure UtworzBrakSpust(spust  : Integer);
    procedure WstawSpustyTemp(czas  : TDateTime);
    procedure WstawSpustyDekl(czas  : TDateTime);
    procedure WstawSpustyRzecz(czas  : TDateTime);
    procedure WstawSpustyKon(czas  : TDateTime);
    procedure WstawSpustyAnalizy(czas  : TDateTime);
    procedure UtworzNowaZmiana(czas  : TDateTime);
    procedure PrzeniesZapasy();
    procedure PrzeniesMedia();
    procedure BilansZaladunku(czas  : TDateTime);
    procedure BilansMediow(czas  : TDateTime);
    procedure ZmianaCzasu();
    procedure Uruchomienie();
    procedure Podglad;
    procedure File2StringGrid(StringGrid: TStringGrid; FileName: String);
    procedure StringGrid2File(StringGrid: TStringGrid; FileName: String);
    procedure UstawWyswietlaneWilg;
    procedure WstawDatyDoStringGridDatyWilg(data : TDate);
    procedure WyswietlDaneWilg(Sender: TObject; data : TDateTime);
    procedure WyliczWilgOd1ego(Sender: TObject; data : TDateTime);
  public
    { Public declarations }
    iNrDyszy            : Byte;
    procedure OtworzRaport(czas  : TDateTime);
    procedure WyczRaport;
    procedure WstawKomunikat;
    procedure ZapiszKomunikat;
    procedure BilansSur();
    procedure UstawDBGrid7;
    procedure LiczWzoryZalad;
    procedure LiczWzoryPom;
  end;

Dla mnie neizrozumiałe jest że FindComponent działa w drugiej części głównego if'a tj. po else a w pierwszej nie. Nawet gdy wpisuję identyczny kod, wyszukujący komponentów statycznie umieszczonych na formie, np:

if Assigned(TStringGrid(FindComponent('StringGrid5'))) then
sleep(3);

po else wchodzi w sleep(3), a przed nie...

1

Kod wrzuć lepiej do pastebin i staraj się nie nazywać funkcji po polskiemu...

@Patryk27 , ty też postaraj się pisać po polsku ;) .

with DataModule1.dbqRzMat do - może coś ci przesłania TForm1 i używasz FindComponent na czymś innym. Sprawdź Self.FindComponent.

Zawsze też możesz zrobić po prostu tablicę z ComboBoxami i nie używać RTTI które moim zdaniem i tak jest lamerskie.

0

with DataModule1.dbqRzMat do - może coś ci przesłania TForm1 i używasz FindComponent na czymś innym.
BINGO!
-123oho +1 :D
Problematyczny kod wyrzucony poza ramy with ... do wykonuje się bezproblematycznie.

@Patryk27:

Kod wrzuć lepiej do pastebin i staraj się nie nazywać funkcji po polskiemu
myślę, że to personalne upodobania i każdy może mieć jakie chce dopóki nie przeszkadzają w kodowaniu, nie gmatwają kodu itd.

0

sory za odkopywanie trupów.
miałem podobny problem i poradziłem sobie tak ze po prostu rekursywnie robiłem listę komponentów zaczynając od znanego rodzica, i jechałem po liście.
dzieki temu byłem pewien ze coś już istnieje, i nie dostawałem takich krzaków jak ty

unit uControls;

interface
  uses Classes, Controls, uBaseObject;

  Type
    TControlsList = class(TList)
    private
      procedure PutCtrl(Index: integer; Value: TControl);
      function GetCtrl(Index: integer): TControl;
    public
        constructor Create; virtual;
        destructor Destroy; override;
        function Add(Item : TControl) : Integer;
        function IndexOf(AItem: Pointer): integer; overload;
        property Items[Index: Integer]: TControl read GetCtrl write PutCtrl; default;
    end;

   var ControlsList : TControlsList;

   Procedure PopulateControls(aParent: TWincontrol);
   Procedure FreeControlsList;

implementation

uses
  SysUtils;


procedure PopulateControlsRecursive(Rodzic: TWincontrol);
var
 i1 : Integer;
 ctrl : TControl;
begin
  ControlsList.Add(Rodzic);
  for i1 := 0 to Rodzic.ControlCount - 1 do
  begin
    ctrl := Rodzic.Controls[i1];
    if ctrl is TWincontrol then
      PopulateControlsRecursive(TWinControl(ctrl))
    else
      ControlsList.Add(TWinControl(ctrl));
  end;
end;

Procedure PopulateControls(aParent: TWincontrol);
begin
  if Assigned(ControlsList) then FreeAndNil(ControlsList);
  ControlsList := TControlsList.Create();
  PopulateControlsRecursive(aparent);

end;

Procedure FreeControlsList;
begin
  if assigned(ControlsList) then freeandnil(ControlsList);
  
end;

{ TControlsList }

procedure TControlsList.PutCtrl(Index: integer; Value: TControl);
begin
  inherited Items[Index] := Value;
end;

function TControlsList.GetCtrl(Index: integer): TControl;
begin
  Result := TControl(inherited Items[Index]);
end;
constructor TControlsList.Create;
begin
  inherited Create;
end;

destructor TControlsList.Destroy;
begin

  inherited Destroy;;
end;

function TControlsList.Add(Item: TControl): Integer;
begin
  Result := inherited Add(Item);
end;


function TControlsList.IndexOf(AItem: Pointer): integer;
begin
  Result := 0;
  while (Result < Count) and (Pointer(Items[Result]) <> AItem) do
    Inc(Result);
  if Result = Count then
    Result := -1;
end;



end.

 

i potem

populatecontrols(jakispanel);

for i:= 0 to controlslist.count - 1 do
begin
  if controlslist[i] is tbutton then ...
end

freecontrolslist;

 

1 użytkowników online, w tym zalogowanych: 0, gości: 1