PopupMenu ShortCut Działa ale z błędami

0

Witam,

Mam taki problem ze skrótem do Itemu w TPopumenu. Otóż ustaliłem Itemu "Dodaj" skrót klawiszowy "Ins". I teraz w momencie kiedy wciskam ten Ins to najpier wywala mi błąd
Access Violation at address....
A potem przechodzi normalnie do tego co ma robić. Po kliknięciu na ten Item, czyli dokładnie to o co mi chodzi.
Ale co jest grane z tym błędem?
Sprawdzałem i wywala ten błąd zanim rozpocznie procedurę Dodaj.OnClick.
Może Wy mi pomożecie?

0

Może gdzie indziej masz zdefiniowany ten klawisz i w tym innym miejscu wywala ten błąd.

0

Raczej nie, bo już dla sprawdzenia wyłączyłem wszędzie te skróty i ciągle wywala ten błąd. Zauważyłem jednak coś jeszcze, ale żeby to wyjaśnić muszę napisać nieco więcej o moim programie.
Otóż tworzę sobie dynamicznie na Panelach inne mniejsze Panele, które ułożone są coś w rodzaju terminarza. I teraz dla tych dynamiczie utworzonch paneli mam PopupMenu w którym właśnie wyskakuje opisany w pierwszym poście błąd.
Dodałem sobie możliwość poruszania się po tych panelach za pomocą TabOrder.
I właśnie w procedurze OnEnter każdego tego Panela robię:
ActiveControl:=Panel na który obecnie przeszedłem. I wlaśnie takiego panela ma dotyczyć skrót Ins. Po kliknięciu go ma pojawić się forma na której będą już odpowiednio ustawione inne kontrolki (w zależności od nazwy kliknietego panela).
I teraz jak wcisnę Ins to wywala ów błąd i przechodzi normalnie do tego Formularza do którego ma przechodzić i ustawia wszystko jak powinien. Jednak po kilku takich próbach błąd przestaje wyskakiwać ale też ustawienia na wywołanej formie nie zmieniają się w zależności od nazwy klikniętego Panela, ciągle jest to samo.
No i tu właśnie nie wiem o co chodzi...
Uffff, mam nadzieję, że nie zakręciłem za mocno :-/

0
penol napisał(a)

Raczej nie, bo już dla sprawdzenia wyłączyłem wszędzie te skróty i ciągle wywala ten błąd. Zauważyłem jednak coś jeszcze, ale żeby to wyjaśnić muszę napisać nieco więcej o moim programie.
Otóż tworzę sobie dynamicznie na Panelach inne mniejsze Panele, które ułożone są coś w rodzaju terminarza. I teraz dla tych dynamiczie utworzonch paneli mam PopupMenu w którym właśnie wyskakuje opisany w pierwszym poście błąd.
Dodałem sobie możliwość poruszania się po tych panelach za pomocą TabOrder.
I właśnie w procedurze OnEnter każdego tego Panela robię:
ActiveControl:=Panel na który obecnie przeszedłem. I wlaśnie takiego panela ma dotyczyć skrót Ins. Po kliknięciu go ma pojawić się forma na której będą już odpowiednio ustawione inne kontrolki (w zależności od nazwy kliknietego panela).
I teraz jak wcisnę Ins to wywala ów błąd i przechodzi normalnie do tego Formularza do którego ma przechodzić i ustawia wszystko jak powinien. Jednak po kilku takich próbach błąd przestaje wyskakiwać ale też ustawienia na wywołanej formie nie zmieniają się w zależności od nazwy klikniętego Panela, ciągle jest to samo.
No i tu właśnie nie wiem o co chodzi...
Uffff, mam nadzieję, że nie zakręciłem za mocno :-/

wszystko pięknie ładnie, opowiadanie na 5 :) ale jakbyś podał kod
a) przypisywania tego skrótu do odpowiedniej "czynności"
b) ta "czynność"
c) kod dookoła ActiveControl := Panel na który obecnie przeszedłem
to można by zacząć szukać błędu

0

ad c)

procedure TFormatka.KomKlik(Sender: TObject);
var
i: integer;
begin

      for i:=0 to Length(tab_panel_dzien)-1 do //tab_panel_dzien dynamiczna, globalna tablica TPanel 
      begin
        if tab_panel_dzien[i].Name='Kom'+Wybrana_Komorka then //wybrana_komorka to zmienna globalna przekazująca id klikniętej komorki
          begin
          ActiveControl:=tab_panel_dzien[i];

          break;
          end;
      end;
 end;

ad b)

procedure TFormatka.KomOnEnter(Sender: TObject);
var
i: integer;
begin

(Sender as TPanel).Font.Color:=clSkyBlue;

for i:=0 to Length(tab_panel_dzien)-1 do
    begin
      if tab_panel_dzien[i].Name='Kom'+Wybrana_Komorka then
         begin
         KomorkaMouseMove(tab_panel_dzien[i],[ssAlt],Mouse.CursorPos.X,Mouse.CursorPos.Y); //KomorkaMouseMove obslugije zdarzenie OnMouseMove dynamicznych komponentow. W zaleznosci od najechanego komponentu pokazuje informacje o nim wzięte z bazy- ale to juz innna bajka
        break;
        end;
    end;
end;

ad a)
Skrót przypisany jest odgórnie do TMenuItem
poprzez ShortCut. Użycie tego skrótu ma być jednoznaczne z kliknięciem na tem MenuItem. Tak jak pisałem błąd wywalany jest jeszcze zanim zostanie rozpoczęte wykonywanie OnClick tego Item'a.

wszystko pięknie ładnie, opowiadanie na 5

Dzięki, starałem się :d

0
  1. używaj tagów < delphi > i < / delphi >
  2. jeśli już masz tablicę tych paneli (na dobrą sprawę każdy ma jakiś index w tej tablicy) to nie prościej w zmiennej globalnej przechowywać Ci ten Index zamiast kawałek nazwy?
  3. zamiast jeździc za każdym razem po tablicy prościej będzie chyba
(FindComponent('Kom" + Wybrana_Komorka) as TPanel)
  1. w momencie, gdzy kontrolka dostanie fokus (np. przez przypisanie jej do ActiveControl) wywołuje się metoda onEnter tej kontrolki, więc wywoływanie jej jeszcze raz z Menu lub przez skrót (Ins) raczej nie ma sensu, bo niewiele zmienia
  2. w procedurze b) kontrolka, którą znajdziesz przez if tab_panel_dzien[i].Name='Kom'+Wybrana_Komorka then ... to ta sama, którą wcześniej już manipulujesz - (Sender as TPanel).Font.Color:=clSkyBlue;
  3. trochę dziwny moim daniem jest pomysł aby w momencie aktywowania kontrolki wywoływać jej procedurę onMouseMove
  4. ostatnie - a jak nie klikniesz INS tylko wybierzesz odpowiednią pozycję w menu to co wtedy - też masz AV?

PS. ja w tym kodzie nie widzę niczego AVgennego. pozakładaj sobie BreakPointy i zobacz, w którym miejscy wywala Ci AV

0

ad 0: zrobione :)
ad 3:Skrót Ins jest mi potrzebny do tego żeby wykonać operacje na danych przypisanych do tej komorki, dlatego przekazuję sobie po prostu id tej komorki w momencie kliknięcia na Item PopupMenu. Chodzi o to, żeby to samo co można zrobić tej komórce myszką mozna było zrobić jej również klawiaturą. Więc muszę najpier wybrac interesująca mnię komórkę (ustalić na nią fokus) aby Ins służył właśnie do tej komórki.
ad 4:No fakt :)
ad 5:To dlatego, że najpierw robiłem onMouseMove które obsługuje służy do opisywania danych z komorki na którą się najedzie, dlatego też już odwołuje się do tej procki
ad 6:Jeśli skorzystam po prostu z menu wybierając je myszką lub klawiaturą wciskając klawisz MenuKontekstowego to idzie wszystko OK.

Korzystanie z breakPointów raczej niewiele da, bo ten problem dotyczy tylko małego fragmentu znacznie bardziej rozbudowanej aplikacji.
No nic kombinuję dalej...

0

Jest jeszcze coś takiego jak menu Search\FindError gdzie wpisujesz adres instrukcji powodującej błąd. Masz to menu po uruchomieniu aplikacji i wpisujesz to co jest po słowie at address. Nie zawsze pomaga, ale może ...

0

Już zrobiłem. Błąd tkwił w zdarzeniu OnPopup. Jedną źle ustawiana była wybrana_komorka. Dzięki za zainteresowanie i Pomoc.
Pozdrawiam

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