Wątek przeniesiony 2014-12-15 00:16 z Delphi i Pascal przez olesio.

Procedura onKeyDown w Dynamicznym Edit

0

Hej.

Sprawa pewnie prosta ale nie mogę znaleźć odpowiedzi...

Chodzi o to, że mam dbGrid ( w którym nie mogę zmienić opcji dgEditing) a w którym chciałbym po DBLClick edytować wybrane pole.

Stworzyłem więc dynamiczny Edit który nachodzi na wybrane pole, sczytuje wartości itd.

Chce żeby po naciśnięciu Enter #13 zamiana się zapisała .

Mam procedure OnKeyPressed dla tego obiektu ale nie wiem jak ustawić zdarzenie bo potrzebuje wartości zmiennej Key dla tego obiektu.

Próbowałem już z

TEditField = Class(TEdit)
public
 procedure OnKeyPressed(Sender:TObject; var Key:char)
end;

var
 EditField:TEditField;

implementation


Procedure TEditField.OnKeyPressed(Sender:TObject; var Key:char);
begin
  If Key = #13 
    then  
   ( Kod )
end;


EditField.OnKeyPress { ( Properies) }:=EditField.OnKeyPressed;

ale chce zmienna i ....

Czy taki zapis różni się od pominięcia tworzenia nowej klasy i tworzenia procedury bezpośrednio na formie?
Przecież w klasie TEdit jest już procedura OnKeyPress ...

Czyli

TMainForm= Class(TForm)

(bla bla bla)

Procedure OnKeyPressed(Sender:TObject; var Key:char);

var
EditField:TEdit;

Implementation

(kod)
EditField.OnKeyPress { ( Properies) }:=MainForm.OnKeyPressed;

Jak odczytać wciśnięty klawisz na dynamicznym obiekcie ??? Na statycznym obsługiwane jest przez zdarzenie które generuje procedure.

PS. Ciągle się uczę i dopiero zaczynam... :/
Dzięki z góry za pomoc

0

To, że zaczynasz wcale nie usprawiedliwia zadawania pytań o banalne podstawy w niewłaściwym dziale. A także nadawania bzdurnego tagu newbie. Poprawiam, ale następnym razem będzie kosz. Bo to nie pierwszy post Twój na tym forum.

Co do pytania, To nie bardzo wiem o co Tobie chodzi. Klawisz wcisnięty w obiekcie odbierzesz ze zmiennej Key. A jako że jest ona poprzedzona słowem var można nadać również wartość zwrotną, na przykład #0 spowoduje, że przy niektórych klawiszach nie będzie słychać "Beepa", w stylu domyślnego wave'a *ding*. A zwrócenie czegoś w stylu na przykład 'a', spowoduje że taka literka nam się pokaże w treści Edita zamiast innego naciskanego klawisza.

Na przyszłość polecam, googlowanie i kombinowanie do bólu. A nie pierwsza napotkana trudność, zamiast sprawdzić na logikę czy coś działa, to od razu smarujesz posta na forum. I to jeszcze nie na właściwą jego część. Tak daleko nie zajdziesz.

//...

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TEditField = class(TEdit)
    procedure OnKeyPressed(Sender : TObject; var Key : Char);
    constructor Create(AOwner : TComponent); override;
  end;
  TForm1 = class(TForm)
    procedure FormClose(Sender : TObject; var Action : TCloseAction);
    procedure FormCreate(Sender : TObject);
  private
  public
    EdtFid : TEditField;
  end;

var
  Form1 : TForm1;

implementation

{$R *.dfm}

procedure TEditField.OnKeyPressed(Sender : TObject; var Key : Char);
begin
  if Key = #13 then
  begin
    ShowMessage('Always use TBrain and google.com!');
    Key := #0;
  end;
end;

constructor TEditField.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  OnKeyPress := OnKeyPressed;
end;

procedure TForm1.FormClose(Sender : TObject; var Action : TCloseAction);
begin
  if EdtFid <> nil then
  begin
    FreeAndNil(EdtFid);
  end;
end;

procedure TForm1.FormCreate(Sender : TObject);
begin
  EdtFid := TEditField.Create(Self);
  with EdtFid do
  begin
    Text := '';
    Parent := Self;
  end;
end;

end.

EDIT: jako, że dałeś tag zarówno Lazarus jak i Delphi nie wiem z jakiego IDE korzystasz. Ale powyższy przykład z Delphi 7, powinien również dać się skompilować pod Lazarusem. A i jeżeli używasz Lazarusa to masz przecież JEDI Code Formatter wbudowany, więc używaj go. Jeśli nie to http://olesio.eu/jcf !

0

nie rozumiem dlaczego się tak oburzasz panie moderatorze - to są jak sam napisałeś " banalne podstawy " dlatego nie rozumiem czemu nie może być newbie.

Też mógłbym być teraz uszczypliwy i coś napisać ...

wracając do tematu....

EdtFld ma być w konstruktorze?

a jak ja mam to w procedurze DBLClick DBGrida to nie zadziała??

bo mi zawsze chce żeby podać paramerty

Procedure mainform.DBGrid1DblClick(Sender: TObject);
begin

EditField.OnKeyPress:=EditField.OnKeyPressed();  

rachfrm.pas(155,47) Error: Wrong number of parameters specified for call to "OnKeyPressed"
   

I rozumiem, że jak coś się wie to jest łatwe... jak się nie wie to się pisze , np tu ..

nie wiem po co jest to forum jak za każde pytanie besztają - że nie googlujesz , nie czytasz ze zrozumieniem , że pytasz o podstawy.. po jaką więc pisać?

A googlowałem i nie znalazłem . próbowałem różnie ciągle nie znalazłem odpowiedzi..

Czytam książkę i jestem na początku klas.

chyba każdy newbie szuka , tylko nie rozumie za wiele i zgłasza się tu.

Może wyjaśnię jaka mi przyświecała idea - edytowanie pól W dbgrid. Właśnie się dowiedziałem, że trzeba zmienić ustawienia w sqlquery żeby to było możliwe w DBgrid -tak zrozumiałem.
Ale że mi się nie udawało więc wymyśliłem ten Edit , ze w procedurze DBlClick zaczyna tworzyć obiekt i nadawać mu wartości. Wtedy pokazuje obiekt i jak rozumiem od tej pory działam na nim. Wiec musze odczytać czy jest to klawisz enter i przypisać polu nową wartość. wszystko jest w DblClick...

Pisze w lazarus - w kwesti wyjaśnień.

0
EditField.OnKeyPress:=EditField.OnKeyPressed();

Było by dobrze, gdyby nie te nawiasy na końcu:

EditField.OnKeyPress := EditField.OnKeyPressed;

Natomiast pod Lazarusem dodatkowo musisz użyć operatora @ - musi być jawne przypisanie adresu:

EditField.OnKeyPress := @EditField.OnKeyPressed;

Choć nie wiem czemu to ma służyć (zamiana zdarzeń, nie użycie operatora, bo w tym przypadku jest bardziej sensowne od konwencji w Delphi); Ale wszystko jedno - sprawdź, przynajmniej będzie się kompilowało; W przyszłości chętniej zaglądaj do dokumentacji, bo Google pokazuje różne strony, często fora (np. StackOverflow) i można się naciąć...

0

po usunięciu nawiasów to samo
po dodaniu @


TEditField = class(TEdit)
   public
    Procedure OnKeyPressed(Sender :TObject;var Key :Char); << linia 16

  end;

>>>>>>>>>>>>>>>>>>>>>>>

procedure Trachform.DBGrid1DblClick(Sender: TObject);

begin

editField:=Teditfield.Create(self);
EditField.OnKeyPress:[email protected];

end;           
    
(16,15) Error: Forward declaration not solved "TEditField.OnKeyPressed(TObject,var Char);"

Wiem, że moja logika na pewno jest zła - wynika z braku wiedzy i doświadczenia , dlatego dużo rzeczy buduje na okrętkę ,czuje to po prostu .... ale co tam - nauka to błędy ( Wielkie odkrycia? Powstają, jak się okazuje przypadkiem - Stephen Hawking, jeden z najwybitniejszych naukowców naszych czasów :D)

1

@GoYo26: mój kod to był tylko przykład. Edit dynamicznie tworzyć możesz w momencie kiedy go potrzebujesz. A zwalniać kiedy już go nie potrzebujesz. Jeśli używasz Lazrusa to tak jak pisał poprzednik.

GoYo26 napisał(a):

nie rozumiem dlaczego się tak oburzasz panie moderatorze - to są jak sam napisałeś " banalne podstawy " dlatego nie rozumiem czemu nie może być newbie.

Nie oburzam się. Tylko moderuje, także przeniosłem wątek tam gdzie od razu powinien być i usunąłem zbędny tag. Uwierz mi, to że ktoś napisze w tagach bzdety w stylu pomocy, pilne, newbie, jestem_zajebisty czy cokolwiek innego niż słowa szybko identyfikujące jeżyk oraz IDE, nie sprawi że wszyscy rzucą wszystko i mu pomogą. Słowa newbie jest absolutnie zbędne, bo należy - póki istnieje taki dział - pisać w nim z pytaniami o podstawy. Niestety prośby, grożby, cokolwiek jak widać nie pomaga. Jak wspomniałem, na forum już jesteś jakiś czas, więc możesz - no właśnie - zastosować się, a nie oburzać się na zwórcenie uwagi przez moderatora.

Szanujmy czytających, dbając o takie niby pozorne detale jak sensowne tagi i umieszczanie od razu wątku gdzie trzeba. O możliwości "koszowania" należy przypominać, bo ludzie się często tutaj nie przejmują tylko wrzucają posty gdzie popadnie. A o kombinowaniu do bólu napisałem, bo widzę tendencje, że ludziom się nie chce pokombinowac chwilę, pierwsze "zacięcie" i jebs post tutaj, post tam.

Wiadomo, moderujemy. furious dodatkowo adminuje. Ale jakby wszyscy byli uprzejmi zapoznać się czasem z przyklejonymi tematami o zasadach, to było by super. Sformatowany kod w odpowiednich znacznikach, sensowne tagi, sensowny temat i pokazanie co już zrobił pytający by rozwiązać problem. Tego uwierz mi bardzo często brakuje. A czyż nie fajniej by się przeglądalo pytania i forum? Gdyby ludzie nie chcieli zachowywać się jak, nie wiem, jacyś bojownicy przeciwko systemowi i ogólnemu ładowi. Tylko stosowali się od początku do naszych zaleceń. Dodałem te public, bo faktycznie tak poprawniej. Tylko o ile constuctor może tam być, to wedle mnie dodatkowa procedura obsługi klawiszy, z logicznego punktu widzenia - niekoniecznie.

EDIT:

GoYo26 napisał(a):

po usunięciu nawiasów to samo
po dodaniu @

Masz przykład sprawdzony żywcem na Lazarusie (ja używam 64 bitowego pod Windows). Jednak to bez większego znaczenia. Kompiluje się i działa ok. Skopiowałem cały kod Unita. Formatka ma oczywiście przypisane przez Inspektor Obiektów odpowiednie zdarzenia. Powinno dać Tobie przykład jak to rozwiązać.

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type
  TEditField = class(TEdit)
  public
    procedure OnKeyPressed(Sender : TObject; var Key : Char);
    constructor Create(AOwner : TComponent); override;
  end;
  { TForm1 }
  TForm1 = class(TForm)
    procedure FormClose(Sender: TObject; var CloseAction: TCloseAction);
    procedure FormCreate(Sender: TObject);
  private
  public
    EdtFid : TEditField;  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TEditField.OnKeyPressed(Sender : TObject; var Key : Char);
begin
  if Key = #13 then
  begin
    ShowMessage('Pisane z pod Lazarusa i nie potrzeba wizy do USA!');
    Key := #0;
  end;
end;

constructor TEditField.Create(AOwner : TComponent);
begin
  inherited Create(AOwner);
  OnKeyPress := @OnKeyPressed;
end;

procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
  if EdtFid <> nil then
  begin
    FreeAndNil(EdtFid);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  EdtFid := TEditField.Create(Self);
  with EdtFid do
  begin
    Text := '';
    Parent := Self;
  end;
end;

end.
0

No to pokaż jak ty tą deklaracje definiujesz?

0

Panie moderatorze - jeśli chodzi o "nie ład" to spoko. Wiem jakieś posty wystawiłem ale wszystkie były poprawiane i.. nieważne - postaram się więcej.

_13th_Dragon napisał(a):

No to pokaż jak ty tą deklaracje definiujesz?

którą?

1
GoYo26 napisał(a):

Panie moderatorze - jeśli chodzi o "nie ład" to spoko. Wiem jakieś posty wystawiłem ale wszystkie były poprawiane i.. nieważne - postaram się więcej.

Spoko, cieszę się że sie rozumiemy. I nie musisz mi "Panować", bo czuje się już jak ten z długą siwą brodą w czerwonym kubraczku, co przynosci prezenty włażąc przez komin. Tymczasem Jemu bliżej wiekowo do Dragona chyba ;)

GoYo26 napisał(a):

którą?

Za pewne chodzi Dragonowi o to, jak u Ciebie wygląda deklaracja klasy tego obsługiwanego po Twojemu Edita.

1

@GoYo26 - poniższy błąd:

(16,15) Error: Forward declaration not solved "TEditField.OnKeyPressed(TObject,var Char);
oznacza, że w danym module zadeklarowane jest zdarzenie OnKeyPress, ale nie można znaleźć jego definicji; Zobacz, czy choćby przez przypadek nie usunąłeś tej definicji (w każdym razie kompilator zgłasza, że jej nie ma).

0

nie wiem czy to chodzi ...

deklaracja klasy :

type

  { TMainform }
  TEditField = class(TEdit)
   public
    Procedure OnKeyPressed(Sender :TObject;var Key :Char); 
   end;

  TMainForm = .....

 

Deklaracja zmiennej EditField :

var
  MainForm: TMainForm;
  EditField:TEditfield;             

Tworzenie Obiektu:

Procedure TMainForm.DBGrid1DblClick(Sender: TObject);

begin
editField:=Teditfield.Create(self);
EditField.OnKeyPress:[email protected];
end;   

1

jasna D...

jak kasowałem inny kod to mi jakoś i procedure w sekcji implementation chapło :/:/:/

Jesteście Wielcy :D

0

Tutaj kłaniają się podstawy. I zasady dotyczące deklaracji i definicji metod. Ja bym tak nie kombinował, jak Ty. Ponieważ jeśli to specyficzna kontrolka, dziedzicząca po TEdit i ma się pokazywać w polach TStringGrid, to dlaczego kod zdarzenia OnKeyPress, ma nie być jej integralną częścią? Coś w ten deseń, jak pokazałem w moich kodach. Ale jeśli się upierasz po dziwacznemu to raczej zrób tak:

  EditField := Teditfield.Create(Self);
  EditField.Parent := Self;
  EditField.OnKeyPress := @TEditField(EditField).OnKeyPressed;
0

Dobra, zapytam inaczej: - jak sądzisz czy tego:

type
  TBalls=1..49;
  TLotoBalls=set of TBalls;
  TLoto=class
    function zwroc_wygrywajace_liczby_nastepnego_lotka:TLotoBalls;
  end;

wystarczy aby się stać milionerem?
Czemu nie wystarczy?
A teraz wróć do pytania tu: http://4programmers.net/Forum/1092085

0

tak się z z innej beczki zapytam .

robiliście studia w kierunku programowanie? czy praca was wykształciła?

ile potrzebowaliście lat na taki poziom - chce ocenić moje szanse za ileś lat...

Widziałem jakieś kursy po 40 godzin ale kwoty to kosmos ... od 12000 zł za podstawy w góre :/

Jeszcze jedno - czy warto interesować się delphi czy lepiej przejść w stronę PHP???

I Szacun za wiedzę + doświadczenie .

Przepraszam za wprowadzenie bałaganu !!!

0

Nie pracuje jako programista. Jeśli chodzi o edukację, to skończyłem tylko studium policalne zaocznie 2 letnie, uzyskując "tytuł" technik - informatyk. Wiele się tam jednak nie nauczyłem. Co do Delphi, to jest niestety już niszowe i mało ofert pracy. Klepaczy w PHP jest za to na pęczki. Ucz się czego chcesz. Ja bym się podszkolił jednak w Delphi, dla siebie. Poźniej można wziąć się za coś innego. Ale to nie pod kątem zawodowym, tylko umiejętności.

Lepiej najpierw według mnie poznać jedno, później kolejne, nie 1000 rzeczy na raz. w PHP napisałem tylko kilka prostych skryptów dla siebie. Pewnie jakby ktoś zobaczył kod to by mnie zabił śmiechem, bo masę rzeczy da się tam zrobić lepiej i optymalniej. Jednak widzę po sobie, że już nie chce się gdy człowiek nie musi uczyć języków programowania, jak mi się pisze cokolwiek.

Do Delphi siadam, wiadomo mając masę swoich poprzednich projektów, których fragmenty kodu można wykorzystać w nowym tworze. Ale przynajmniej wiem co mam zrobić i jak. A pisząc nawet coś prostego w PHP, praktycznie nic od zera nie napisze, muszę robić wklejki z innych skryptów, a do tego mozolne googlowanie i głowienie się jak coś ogarnąć. Tak to jest właśnie jak zna się tylko podstawy.

Podsumowując, to co umiem w Delphi, nauczyłem się dzięki głównie temu forum. Kiedy coś tam kiedyś klecąc przy odpisywaniu na pytania, poznawałem nowe zagadnienia i możliwości. Wcześniej coś tym umiałem zakodzić, ale bez szału. Teraz może też szału nie ma, ale nauczyłem się kiedy coś potrzebuje, to sobie to napisac. Poznałem jako tako WinAPI, może już też trochę zapomniane i używane głownie przez piszących w tym pod C++. Jednak nieraz się przydaje coś prostego w tym napisać.

Prawda jest też taka, że z czasem kodząc coś w jakimś języku, będziesz miał takie dla siebie jakby portfolio projektów. Później coś kodząc, nie będziesz wymyślać koła od nowa i nie musisz od zera czegoś robić, tylko sobie z wielu "myków" skorzystasz, przyśpieszając powstawanie nowej aplikacji. bo masz własne biblioteki, moduły z kodem czy nawet proste narzędzia swojego autorstwa.

Więcej pewnie Tobie da lektura innych wątków, w stylu "jak zacząć perogramowanie w" albo "czego się uczyć by później mieć prace jako programista". Takich wątków na forum przewinełó się mnóstwo. Jest nawet na 4p osobny dział poświęcony takiej tematyce.

0

sprawa taka że się zastanawiam.

mam ok 8 miesięcy wolnego i chcę to jakoś sensownie wykorzystać...
wątpię żeby ktokolwiek mnie uznał nawet po 8 miesiącach za programistę , myśle bardziej o sobie .
ale dzięki za porady

0

Powinieneś założyć osobny wątek w odpowiednim do tego celu dziale, w którym toczyła by się dyskusja na temat Twojej przyszłości itd.; Ale skoro już niegroźny off-topic się rozwinął, to się do niego dorzucę :]

mam ok 8 miesięcy wolnego i chcę to jakoś sensownie wykorzystać...

No to nie zastanawiaj się, tylko siadaj do nauki;

Tu wszyscy się uczymy i ćwiczymy umiejętności; Bez solidnej nauki co najmniej podstaw programowania strukturalnego i obiektowego nie ma co nawet myśleć o przyszłości związanej z programowaniem; W sieci znajdziesz mnóstwo kursów, tutoriali, artykułów i dokumentacji, z których sam nauczysz się programować - wystarczą tylko chęci i czas wolny, którego masz póki co bardzo dużo;

wątpię żeby ktokolwiek mnie uznał nawet po 8 miesiącach za programistę , myśle bardziej o sobie .

A kimże jest programista? Może podam krótką i ogólną definicję:

Programista, zwany też potocznie koderem to osoba, która tworzy programy komputerowe w pewnym języku programowania. Termin ten może odnosić się także do specjalisty w jednej dziedzinie programowania. Większość programistów zna co najmniej kilka języków programowania (np. C, C++, Java), lecz specjalizuje się tylko w wybranych z nich. Nazwa głównego języka jest często dodawana do nazwy stanowiska, np. programista C++, aby podkreślić specjalizację.

czyli ktoś, kto zna co najmniej jeden język programowania i potrafi w nim tworzyć oprogramowanie, a nie tylko zawodowy korpo-klepacz; Najpierw naucz się porządnie języka i wciągnij się w matrixa, a potem będziemy się zastanawiać nad tym, jakim mianem Cię określać.

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