www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Prvi koraki v Delphiju
Pojdi na stran Prejšnja  1, 2, 3, 4, 5  Naslednja
 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programska oprema
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
GJ
Član
Član



Pridružen-a: Čet 02 Nov 2006 15:51
Prispevkov: 946
Aktiv.: 4.16
Kraj: Ljubljana

PrispevekObjavljeno: Čet Sep 27, 2007 7:11 pm    Naslov sporočila:   Odgovori s citatom

Silvo je napisal/a:
Poskusil sem proceduro Val ter funkcijo StrToFloat. Kako rešujete podobne težave?


Najlažje preveriš dogodek OnKeyPress takole:

Koda:
procedure TForm.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in['0'..'9','-',DecimalSeparator, #8, #13, #128])then
    key:=#0;
  if key=#13 then               //Če pritisneš enter se naj izvrši...
    IzracunajPodatek;
end;


Kasneje pa takole:
Koda:

 try
   x := StrToInt(...
 except
     //pohendli napako!
 end;



Drugače pa je to že nova tema! Cool

LP GJ
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14677
Aktiv.: 61.80

PrispevekObjavljeno: Čet Sep 27, 2007 7:37 pm    Naslov sporočila:   Odgovori s citatom

V tem sem napisal lastno funkcijo, ki počisti sporne presedke. (Že vidim, da bom moral napisati kar nekaj funkcij, ki sem jih bil vajen) Wink

Koda:
function cisti(s1:string):string;
var dol_n,najden:integer;
niz:string;
begin
niz:=trim(s1);

while Pos(' ',niz)<>0  do
begin
najden:=pos(' ',niz);
delete(niz,najden,1);
end;
cisti:=niz;
end;


Enkrat sem že vprašal a odgovora nisem najbolje razumel. Kje in kako napovem svojo lastno funkcijo, da bo dostopna tudi kodi, ki je napisana pred njo?

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
GJ
Član
Član



Pridružen-a: Čet 02 Nov 2006 15:51
Prispevkov: 946
Aktiv.: 4.16
Kraj: Ljubljana

PrispevekObjavljeno: Čet Sep 27, 2007 7:59 pm    Naslov sporočila:   Odgovori s citatom

Silvo je napisal/a:
Enkrat sem že vprašal a odgovora nisem najbolje razumel. Kje in kako napovem svojo lastno funkcijo, da bo dostopna tudi kodi, ki je napisana pred njo?

Delphi je objektni jezik! V ta namen koristi dogodke oziroma event-e!
Na hitro..
Greš v 'Object inspektor' (tipka F11) klikneš na 'Events' tab nato dvakrat klikneš na željeni 'event', nakar ti Delphi generira ogrodje kode v katero vpišeš svoje programske vrstice.
Enega (OnKeyPress oziroma Edit1KeyPress) sem ti spisal zgoraj.

LP GJ


Nazadnje urejal/a GJ Čet Sep 27, 2007 8:00 pm; skupaj popravljeno 1 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.51

PrispevekObjavljeno: Čet Sep 27, 2007 8:00 pm    Naslov sporočila:   Odgovori s citatom

Keyword "forward". Preberi Help, vse pise Wink
_________________
Ka ti bo pa torba ce si kupu kolo ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
GJ
Član
Član



Pridružen-a: Čet 02 Nov 2006 15:51
Prispevkov: 946
Aktiv.: 4.16
Kraj: Ljubljana

PrispevekObjavljeno: Čet Sep 27, 2007 8:07 pm    Naslov sporočila:   Odgovori s citatom

Sokrat je napisal/a:
Keyword "forward". Preberi Help, vse pise Wink

Deklaracija "forward" je prazgodovina in je normalno ne potrebuješ, če le pravilno gnezdiš procedure oziroma funkcije.

LP GJ
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14677
Aktiv.: 61.80

PrispevekObjavljeno: Čet Sep 27, 2007 8:47 pm    Naslov sporočila:   Odgovori s citatom

GJ je napisal/a:
Silvo je napisal/a:
Enkrat sem že vprašal a odgovora nisem najbolje razumel. Kje in kako napovem svojo lastno funkcijo, da bo dostopna tudi kodi, ki je napisana pred njo?

Delphi je objektni jezik! V ta namen koristi dogodke oziroma event-e!
Na hitro..
Greš v 'Object inspektor' (tipka F11) klikneš na 'Events' tab nato dvakrat klikneš na željeni 'event', nakar ti Delphi generira ogrodje kode v katero vpišeš svoje programske vrstice.
Enega (OnKeyPress oziroma Edit1KeyPress) sem ti spisal zgoraj.

LP GJ


To vse razumem in stvar tudi uporabljam.

Tukaj glej je celotna testna koda.


Koda:

unit izracun;

interface

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

type
  TForm1 = class(TForm)
    MaskEdit1: TMaskEdit;
    MaskEdit2: TMaskEdit;
    MaskEdit3: TMaskEdit;
    MaskEdit4: TMaskEdit;
    MaskEdit5: TMaskEdit;
    MaskEdit6: TMaskEdit;
    MaskEdit7: TMaskEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    MaskEdit8: TMaskEdit;
    MaskEdit9: TMaskEdit;
    Button1: TButton;
    MaskEdit10: TMaskEdit;
    Label9: TLabel;
    Label10: TLabel;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure MaskEdit1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure MaskEdit10Change(Sender: TObject);
    procedure MaskEdit1Click(Sender: TObject);
    procedure MaskEdit10Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MaskEdit1Change(Sender: TObject);
begin
if length(Trim(MaskEdit1.Text))<1 then MaskEdit1.Text:='1';
//(ShowMessage(IntToStr(MaskEdit1.GetTextLen));
MaskEdit8.Text:=FloatToStr(
round(StrTofloat(trim(MaskEdit1.Text)))*
StrToIntdef(trim(MaskEdit2.Text),0)/1000*
StrToIntdef(trim(MaskEdit3.Text),0)/1000*
StrToIntdef(trim(MaskEdit4.Text),0)/1000);

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
close;
end;

procedure TForm1.MaskEdit10Change(Sender: TObject);

begin
if  StrToIntDef(MaskEdit2.Text,0)=0 then
begin
Maskedit2.Color:=clred;
Application.MessageBox('Vnesi debelino','Napaka',0);
MaskEdit2.SetFocus;
MaskEdit2.Color:=ClWhite;
end

else

MaskEdit1.Text:=FloatToStr(round(
StrToIntdef(trim(MaskEdit10.Text),0)/
(StrToIntdef(trim(MaskEdit2.Text),0)/1000*
StrToIntdef(trim(MaskEdit3.Text),0)/1000*
StrToIntdef(trim(MaskEdit4.Text),0)/1000)));
end;

procedure TForm1.MaskEdit1Click(Sender: TObject);
begin
MaskEdit10.Color:= clGray;
MaskEdit10.ReadOnly:=true;
end;

procedure TForm1.MaskEdit10Click(Sender: TObject);
begin
MaskEdit10.Text:='0';
MaskEdit10.Color:= clnone;
MaskEdit10.ReadOnly:=false;
end;


function cisti(s1:string):string;
var dol_n,najden:integer;
niz:string;
begin
niz:=trim(s1);

while Pos(' ',niz)<>0  do
begin
najden:=pos(' ',niz);
delete(niz,najden,1);
end;
cisti:=niz;
end;



procedure TForm1.Button2Click(Sender: TObject);
var pl_min,vse_pl,faktor_S,hitrost,pl_h:real;
kje,I:integer;
kaj:string;

begin

edit1.Text:=cisti(edit2.Text);
MaskEdit6.Text:=cisti(MaskEdit6.Text);
hitrost:=0 ;
val(MaskEdit6.Text,hitrost,i);
pl_min:=hitrost/
(StrToIntDef(Trim(MaskEdit3.text),0)/1000);
vse_pl:=StrToIntDef(Trim(MaskEdit1.Text),0)/pl_min;
MaskEdit9.Text:=FloatToStr(vse_pl);
faktor_S:=(60/(StrToInt(MaskEdit2.Text)+StrToFloat(MaskEdit5.Text)))*
(32.35/StrToFloat(MaskEdit6.Text));
MaskEdit7.Text:=FloatToStr(faktor_s);
Edit1.Text:=FloatToStr(pl_min*60);

end;

 

end.

Nekje vmes je napisana lastna funkcija "cisti" ki je uporabljena v proceduri TForm1.Button2Click(Sender: TObject) Če bi želel to isto funkcijo uporabit v kodi napisano višje, je ne najde.([Error] izracun.pas(100): Undeclared identifier: 'cisti')
Sprašujem, če jo je možno kje napovedati oz. mora biti napisana nad vso kodo.

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.51

PrispevekObjavljeno: Čet Sep 27, 2007 10:10 pm    Naslov sporočila:   Odgovori s citatom

GJ je napisal/a:
Sokrat je napisal/a:
Keyword "forward". Preberi Help, vse pise Wink

Deklaracija "forward" je prazgodovina in je normalno ne potrebuješ, če le pravilno gnezdiš procedure oziroma funkcije.


Dopovej ti to cloveku. Vprasal je, ali je mozno deklarirati prej metodo in jo napisati sele nizje, ne pa ali je nekaj po tvoje prazgodovina. Odgovor na zastavljeno vprasanje je da, to se naredi s keywordom forward.

Ker nisi vec v prazgodovini, mi bos razlozil kako s pravilnim gnezdenjem metod resis rekurzivni klic dveh funkcij (ena v svojem telesu klice drugo in obratno, dokler se ena ne ustavi ob dolocenem pogoju) ...

@Silvo: na vrh (pod vrstico implementation) napisi

Koda:
function cisti(s1:string):string; forward;


pa bo funkcija cisti vidna po celi knjiznici, ne glede na to kje bo dejansko napisana, in cisto zares preberi Help, ker je zelo informativen.

_________________
Ka ti bo pa torba ce si kupu kolo ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14677
Aktiv.: 61.80

PrispevekObjavljeno: Čet Sep 27, 2007 10:24 pm    Naslov sporočila:   Odgovori s citatom

Sokrat, precej si pomagam s helpom, a je zelo obsežen, zato za razne "fore" raje vprašam na forum.
_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Sokrat
Član
Član



Pridružen-a: Čet 25 Avg 2005 11:00
Prispevkov: 5584
Aktiv.: 23.51

PrispevekObjavljeno: Čet Sep 27, 2007 10:31 pm    Naslov sporočila:   Odgovori s citatom

Ctrl+F1 takrat, ko imas kurzor na besedi, ki te zanima.
_________________
Ka ti bo pa torba ce si kupu kolo ?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
GJ
Član
Član



Pridružen-a: Čet 02 Nov 2006 15:51
Prispevkov: 946
Aktiv.: 4.16
Kraj: Ljubljana

PrispevekObjavljeno: Čet Sep 27, 2007 11:01 pm    Naslov sporočila:   Odgovori s citatom

Silvo je napisal/a:

Nekje vmes je napisana lastna funkcija "cisti" ki je uporabljena v proceduri TForm1.Button2Click(Sender: TObject) Če bi želel to isto funkcijo uporabit v kodi napisano višje, je ne najde.([Error] izracun.pas(100): Undeclared identifier: 'cisti')
Sprašujem, če jo je možno kje napovedati oz. mora biti napisana nad vso kodo.


Ahh..
Seveda gre, Delphi pascal to dopušča na več načinov!
Prvi način je, da celotno proceduro 'cisti' prestaviš na začetek.
Drugi način pa je, da navedeš funkcijo 'cisti' v interface delu nekako takole..
Koda:
type
  TForm1 = class(TForm)
    //...
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    //...
  public
    { Public declarations }
    //...
  end;

  function cisti(s1:string):string;



Za kar pa seveda ne potrebuješ forward direktive.. Laughing

Sokrat je napisal/a:
Ker nisi vec v prazgodovini, mi bos razlozil kako s pravilnim gnezdenjem metod resis rekurzivni klic dveh funkcij (ena v svojem telesu klice drugo in obratno, dokler se ena ne ustavi ob dolocenem pogoju) ...

Tako kot si že sam ugotovil.. V deklariraš jo v interface delu!
Direktive forward pa ne potrebuješ, ker se danes uporablja le še zaradi kompatibilnosti s starimi programi!

LP GJ


Nazadnje urejal/a GJ Čet Sep 27, 2007 11:06 pm; skupaj popravljeno 3 krat
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14677
Aktiv.: 61.80

PrispevekObjavljeno: Čet Sep 27, 2007 11:03 pm    Naslov sporočila:   Odgovori s citatom

GJ je napisal/a:
Silvo je napisal/a:

Nekje vmes je napisana lastna funkcija "cisti" ki je uporabljena v proceduri TForm1.Button2Click(Sender: TObject) Če bi želel to isto funkcijo uporabit v kodi napisano višje, je ne najde.([Error] izracun.pas(100): Undeclared identifier: 'cisti')
Sprašujem, če jo je možno kje napovedati oz. mora biti napisana nad vso kodo.


Ahh..
Seveda gre, Delphi pascal to dopušča na več načinov!
Prvi način je, da celotno proceduro 'cisti' prestaviš na začetek.
Drugi način pa je, da navedeš funkcijo 'cisti' v interface delu nekako takole..
Koda:
type
  TForm1 = class(TForm)
    //...
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    //...
  public
    { Public declarations }
    //...
  end;

  function cisti(s1:string):string;



Za kar pa seveda ne potrebuješ forward direktive.. Laughing

LP GJ


Tole sem hotel, hvala. Cool

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
GJ
Član
Član



Pridružen-a: Čet 02 Nov 2006 15:51
Prispevkov: 946
Aktiv.: 4.16
Kraj: Ljubljana

PrispevekObjavljeno: Čet Sep 27, 2007 11:25 pm    Naslov sporočila:   Odgovori s citatom

Silvo je napisal/a:
Tole sem hotel, hvala. Cool


Ni zakaj!
Ampak..
Pristop reševanja tvojega problema ni elegaten (slab dizajn), da ne rečem ni objektno usmerjen.
Pravilen pristop bi bil sledeč..
Proceduro, ki sem ti jo navedel že zgoraj preimenuješ recimo v OnKeyPress..
Koda:
procedure TForm1.OnKeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in['0'..'9','-',DecimalSeparator, #8, #13, #128])then
    key:=#0;
end;


Procedure navedeš v class-u pod TForm1 v 'private' deklaraciji.
Nato to proceduro vključiš v vse evente objktov (morajo biti izpeljani iz objekta TCustomEdit), ki jih želiš preverjati torej pod recimo Edit1.OnKeyDown ali pa TMaskEdit.OnKeyDown.
Procedure 'cisti' tako sploh ne rabiš, saj na tak način ne moreš vnesti napačnih znakov.

Aha še to, nauči se podpisovati oziroma zamikati kodo, tako pridobiš na preglednosti celotne kode programa!

LP GJ
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14677
Aktiv.: 61.80

PrispevekObjavljeno: Čet Sep 27, 2007 11:31 pm    Naslov sporočila:   Odgovori s citatom

Citiram:
Aha še to, nauči se podpisovati oziroma zamikati kodo, tako pridobiš na preglednosti celotne kode programa!


To sicer delam - to je le testno kracanje - nisem se še navadil editorja. Tole je šele moj drugi dan Delphija v praksi. Vseno hvala za nasvet.

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
GJ
Član
Član



Pridružen-a: Čet 02 Nov 2006 15:51
Prispevkov: 946
Aktiv.: 4.16
Kraj: Ljubljana

PrispevekObjavljeno: Čet Sep 27, 2007 11:43 pm    Naslov sporočila:   Odgovori s citatom

Še nekaj kar ti zna zagreniti programiranje..

Znak za DecimalSeparator je v slovenskih winsih različen kot v ameriških, enkrat je '.' drugič pa ','.
Torej, če boš svoj program prevedel pod slovenskimi winsi ti ne bo pravilno deloval pod ameriškimi in obratno, seveda le če preverjaš ročno tudi DecimalSeparator ! Zato uporabljaj variablo DecimalSeparator, ki se definira ob zagonu programa (prekopirana je iz sistemskih registrov) v unitu SysUtils. Moja zgornja rutina to seveda upošteva!

LP GJ
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
jur
Član
Član



Pridružen-a: Pet 02 Dec 2005 14:45
Prispevkov: 5142
Aktiv.: 21.65
Kraj: [color=zelena]Ljubljana[/color]

PrispevekObjavljeno: Pet Sep 28, 2007 8:55 am    Naslov sporočila:   Odgovori s citatom

Forward direktiva je kar dobra stvar. Na delovanje programa ne vpliva, objektno programiranje gor ali dol. Uporaba je bistveno hitrejša in bolj praktična, kot kopiranje procedure na začetek, ali vpisovanje v interface section programa (to je le bolj komplicirana oblika forwarda, kjer je za povrh potrebno vpisati ali copy/paste premakniti vse parametre).

Podobna zadeva je goto stavek. Nekateri se kar nerazumljivo zgražajo nad njim, vendar je izjemno učinkovit (in kratek) za uporabo (strukturirano programiranje gor ali dol).

Mimo tematike: Enkrat je ena programerska firma uporabnikom razlagala delovanje in uporabo svojega novega programa. V vsakem drugem stavku je bilo omenjeno objektno ali strukturirano programiranje, tako da ubogi uporabniki pojma niso imeli, kako naj uporabljajo program. Sem rekel: ja guspa, sej mi tle vse delamo z objekti. Tud drva t_ko zlagamo. Od takrat naprej so samo z stisnjenimi zobmi pojasnjevali uporabo programa. Brez objektov in podobnega nakladanja. Twisted Evil

'1 ,0' is not a valid floating point value':
Uporabljam izključno decimalno piko, ne vejice in nisem še doživel kaj takega. Je pa to pravilno. 1,0 ni float. Float je 1.0.
Pascal je strahovito tečen jezik. Zahteva da nad tipi/z tipi uporablja točno tiste operacije, ki so dovoljene za ta tip. Če sta A in B celi števili (integer), je operacija A/B napačna (realno deljenje). Pravilno je A div B (celoštevilsko deljenje). Dokler se tega ne navadiš, je problem. Se pa na ta način izogneš zelo zoprnim in nepredvidljivim napakam. Razni basici so zračunajo vse, kar jim podtakneš. Večkrat narobe.

Jur
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Programska oprema Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Pojdi na stran Prejšnja  1, 2, 3, 4, 5  Naslednja
Stran 4 od 5

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 7 dni


Powered by phpBB © 2001, 2005 phpBB Group