 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Čet Sep 27, 2007 7:11 pm Naslov sporočila: |
|
|
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!
LP GJ |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14677 Aktiv.: 61.80
|
Objavljeno: Čet Sep 27, 2007 7:37 pm Naslov sporočila: |
|
|
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)
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 |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Čet Sep 27, 2007 7:59 pm Naslov sporočila: |
|
|
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 |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.51
|
Objavljeno: Čet Sep 27, 2007 8:00 pm Naslov sporočila: |
|
|
Keyword "forward". Preberi Help, vse pise  _________________ Ka ti bo pa torba ce si kupu kolo ? |
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Čet Sep 27, 2007 8:07 pm Naslov sporočila: |
|
|
Sokrat je napisal/a: |
Keyword "forward". Preberi Help, vse pise  |
Deklaracija "forward" je prazgodovina in je normalno ne potrebuješ, če le pravilno gnezdiš procedure oziroma funkcije.
LP GJ |
|
Nazaj na vrh |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14677 Aktiv.: 61.80
|
Objavljeno: Čet Sep 27, 2007 8:47 pm Naslov sporočila: |
|
|
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 |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.51
|
Objavljeno: Čet Sep 27, 2007 10:10 pm Naslov sporočila: |
|
|
GJ je napisal/a: |
Sokrat je napisal/a: |
Keyword "forward". Preberi Help, vse pise  |
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 |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14677 Aktiv.: 61.80
|
Objavljeno: Čet Sep 27, 2007 10:24 pm Naslov sporočila: |
|
|
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 |
|
 |
Sokrat Član


Pridružen-a: Čet 25 Avg 2005 11:00 Prispevkov: 5584 Aktiv.: 23.51
|
Objavljeno: Čet Sep 27, 2007 10:31 pm Naslov sporočila: |
|
|
Ctrl+F1 takrat, ko imas kurzor na besedi, ki te zanima. _________________ Ka ti bo pa torba ce si kupu kolo ? |
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Čet Sep 27, 2007 11:01 pm Naslov sporočila: |
|
|
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..
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 |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14677 Aktiv.: 61.80
|
Objavljeno: Čet Sep 27, 2007 11:03 pm Naslov sporočila: |
|
|
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..
LP GJ |
Tole sem hotel, hvala.  _________________ lp
Silvo |
|
Nazaj na vrh |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Čet Sep 27, 2007 11:25 pm Naslov sporočila: |
|
|
Silvo je napisal/a: |
Tole sem hotel, hvala.  |
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 |
|
 |
Silvo Moderator


 
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14677 Aktiv.: 61.80
|
Objavljeno: Čet Sep 27, 2007 11:31 pm Naslov sporočila: |
|
|
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 |
|
 |
GJ Član


Pridružen-a: Čet 02 Nov 2006 15:51 Prispevkov: 946 Aktiv.: 4.16 Kraj: Ljubljana
|
Objavljeno: Čet Sep 27, 2007 11:43 pm Naslov sporočila: |
|
|
Š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 |
|
 |
jur Član


Pridružen-a: Pet 02 Dec 2005 14:45 Prispevkov: 5142 Aktiv.: 21.65 Kraj: [color=zelena]Ljubljana[/color]
|
Objavljeno: Pet Sep 28, 2007 8:55 am Naslov sporočila: |
|
|
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.
'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 |
|
 |
|
|
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
|