Wątek przeniesiony 2014-12-15 00:16 z przez olesio. Powód: Wątek dotyczący podstaw

Procedura onKeyDown w Dynamicznym Edit

Odpowiedz Nowy wątek
2014-12-14 23:09
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

edytowany 3x, ostatnio: GoYo26, 2014-12-14 23:21

Pozostało 580 znaków

2014-12-15 00:15
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 !


edytowany 4x, ostatnio: olesio, 2014-12-15 00:21

Pozostało 580 znaków

2014-12-15 00:53
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ń.

Pozostało 580 znaków

2014-12-15 00:57
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ąć...


edytowany 3x, ostatnio: furious programming, 2014-12-15 01:01

Pozostało 580 znaków

2014-12-15 01:16
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:=@EditField.OnKeyPressed;
 
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)

Pozostało 580 znaków

2014-12-15 01:19
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.

edytowany 5x, ostatnio: olesio, 2014-12-15 01:30

Pozostało 580 znaków

2014-12-15 01:27
0

No to pokaż jak ty tą deklaracje definiujesz?


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Pozostało 580 znaków

2014-12-15 01:33
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ą?

Pozostało 580 znaków

2014-12-15 01:39
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.


edytowany 3x, ostatnio: olesio, 2014-12-15 01:41

Pozostało 580 znaków

2014-12-15 01:45
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).


Pozostało 580 znaków

2014-12-15 01:49
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:=@EditField.OnKeyPressed;
end;   
 
edytowany 1x, ostatnio: GoYo26, 2014-12-15 01:50

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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