![]() |
wie initialisiert man am besten Variablen-Typen?
Hallo zusammen,
ich verwende relativ viele Variablen; vom Typ -> Integer, Char und String Damit ich nun nicht in jeder Procedur die einzelnen Variablen initialisieren muss, würde ich das gern über 3 Funktionen machen. (pro Variablen-Typ eine Function) Aber ich bekomme es nicht hin :oops: Wahrscheinlich ist es ganz leicht und sehe den Wald vor lauter Bäumen nicht?! Kann mir da jemand helfen Gruß Jürgen |
Re: wie initialisiert man am besten Variablen-Typen?
Zitat:
p.s.: um was für Variablen handelt es sich denn (Global, Lokal, Felder in Klassen etc.)? |
Re: wie initialisiert man am besten Variablen-Typen?
Hallo BlackJack,
nun genau das möchte ich ja vermeiden! Ich nutze PRO Procedure teilweise über 20 Variablen.... Die Anzahl der Proceduren wird relativ hoch sein.... Und da möchte ich eben 1.) wegen der Übersicht und 2.) natürlich der "Faulheit wegen nicht jedesmal diese "Flut" der Variablen EINZELN neu initialisieren müssen.... Gruß Jürgen |
Re: wie initialisiert man am besten Variablen-Typen?
Zitat:
|
Re: wie initialisiert man am besten Variablen-Typen?
Zitat:
hier ein paar vorschläge: 1. den Code überdenken, z.b. ob du die Variablen nicht Global machen oder z.b. in einem Record zusammenfassen kannst ;) 2. eine unterprocedure erstellen, die die variablen initialisiert, und die dann C&P-en 3. den initialisierungscode direkt C&P-en 4. eine procedure erstellen, die die variablen initialisiert, und die varialben dann als var übergeben. 4.1. da die parameterliste bei 20 zu initialisierenden Parametern etwas lang werden würde, könntest du dann alle Chars, alle Integer und alle Strings jeweils in einem Record zusammenfassen, sodass du an die procedure aus 4. dann nur noch die 3 Records als var-parameter übergeben müsstest anstatt die 3*20 Vairablen einzeln übergeben zu müssen. |
Re: wie initialisiert man am besten Variablen-Typen?
Zitat:
Zitat:
|
Re: wie initialisiert man am besten Variablen-Typen?
Zitat:
naja so war das mit dem global eigentlich auch nicht gemeint, ich hatte eher an sowas gedacht, dass man die vielen proceduren so kapelst, dass sie alle zugriff auf die entsprechenden variablen haben, also z.b. das ganze als Klasse zu konstruieren. |
Re: wie initialisiert man am besten Variablen-Typen?
@ Sniper_W
nun, ich als Anfänger habe jetzt lange mit mir gerungen, ob ich eine der Proceduren hier posten sollte. (schäm..) Aber vielleicht kann ich von der zu erwartenden konstruktiven Kritik und Schelte ja auch wieder einiges lernen, da ich mir bis jetzt alles (sehr mühevoll) erarbeiten musste. (mit sehr großer Hilfe dieses Forums übrigens :mrgreen: ) Ein weiteres "Problem" ist eben auch die verwendeten Variablen in dieser einen Procedur zu ermitteln Aber ich habe mir den Code genau angeschaut, es können tatsächlich ALLE Variablen bei jeder Procedur neu initialisert werden. Das macht dann alles einfacher.
Delphi-Quellcode:
procedure TSpezieller_Rechner.AdditionClick(Sender: TObject);
Begin a := 0 ; b := 0 ; c := 0 ; If Flset = false then begin try a := strtofloat(InputA.text); b := strtofloat(InputB.text); c := a + b; OutputC.text := formatfloat('#,##0.######',c); Zwischenspeicher.text := floattostr(c); except Windows.Beep(2000,250) ; ShowMessage ('Bitte kontrollieren: Eingabe ist falsch!" '); InputA.SetFocus end; end else begin lsTime_a := Trim(InputA.Text); lcDelim_a := ':'; liPos_a := Pos(lcDelim_a, lsTime_a); if (liPos_a = 0) then begin lcDelim_a := '.'; liPos_a := Pos(lcDelim_a, lsTime_a); end; if (liPos_a = 0) then begin lcDelim_a := ','; liPos_a := Pos(lcDelim_a, lsTime_a); end; if (liPos_a = 0) then begin lsHour_a := lsTime_a; lsMinute_a := ''; end else begin lsHour_a := Copy(lsTime_a, 1, liPos_a - 1); lsMinute_a := Copy(lsTime_a, liPos_a + 1, MaxInt); end; try // except if (lsHour_a = '') then begin liHour_a := 0; end else begin liHour_a := StrToInt(lsHour_a); end; if (lsMinute_a = '') then begin liMinute_a := 0; end else begin liMinute_a := StrToInt(lsMinute_a); end; except on EConvertError do begin ShowMessage('Eingabe falsch') end; end; // except lsTime_b := Trim(InputB.Text); lcDelim_b := ':'; liPos_b := Pos(lcDelim_b, lsTime_b); if (liPos_b = 0) then begin lcDelim_b := '.'; liPos_b := Pos(lcDelim_b, lsTime_b); end; if (liPos_b = 0) then begin lcDelim_b := ','; liPos_b := Pos(lcDelim_b, lsTime_b); end; if (liPos_b = 0) then begin lsHour_b := lsTime_b; lsMinute_b := ''; end else begin lsHour_b := Copy(lsTime_b, 1, liPos_b - 1); lsMinute_b := Copy(lsTime_b, liPos_b + 1, MaxInt); end; try // except if (lsHour_b = '') then begin liHour_b := 0; end else begin liHour_b := StrToInt(lsHour_b); end; if (lsMinute_b = '') then begin liMinute_b := 0; end else begin liMinute_b := StrToInt(lsMinute_b); end; except on EConvertError do begin ShowMessage('Eingabe falsch') end; end; // except If (liMinute_a + liMinute_b >59) then begin Min_ := 1; //diesen Wert muss später in Variable "o" zu den Stunden dazu gezählt werden end; o := (liHour_a) + (liHour_b) + Min_; // Stundensumme p := ((liMinute_a) + (liMinute_b)); // Minutensumme If (p >=60) then begin // wenn die Minutensumme >=60 ist, so wird von der Variable "s" 60 Minuten abgezogen s := -60 + (p); end else begin s := (p); end; try //except OutputC.text := floattostr(o)+ ':' + formatfloat('00.##',s); //Anzeigen des Ergebnisses in Normalminuten @ BlackJack zu 1.) -> ich kanns net besser... :oops: zu 2.) -> das hört sich doch interessant an! Wie kann man denn eine "Unterprocedur" erstellen und in einer Procedur dann verwenden? (ich meine, dass wäre doch genau das was ich will) zu 3.) ist damit einfach zu unübersichtlich... zu 4.) verstehe ich net ganz. Wenn keine weiteren Posts kommen die mir hier schneller weiter helfen, würde ich mich da mal "einarbeiten" Gruß Jürgen |
Re: wie initialisiert man am besten Variablen-Typen?
Moin Jürgen,
Zitat:
Als erstes solltest Du Dir mal Gedanken um die Benennung Deiner Bezeichner (speziell die der Variablen a,b und c) machen. Ich bin mir nämlich ziemlich sicher, dass Du in einer Woche deren Bedeutung selber nicht mehr weisst ;-) Bei den anderen Bezeichnern hast Du es ja auch gemacht (oder entstammen die von anderer Stelle). Wenn Du viele Variablen brauchst wäre die Idee von BlackJack mit dem Record eine gute Idee. Mal ein Beispiel mit Deinen drei Variablen:
Delphi-Quellcode:
@BlackJack:
type
TjMyRecord = record a : integer; b : integer; c : integer; end; procedure InitLocalVars(var ArVariablen : TjMyRecord); begin ArVariablen.a := 1; ArVariablen.b := 2; ArVariablen.c := 3; end; procedure WasAuchImmer; var rVariablen : TjMyRecord; begin InitLocalVars(rVariablen); //.... end; Zitat:
Wenn derzeit jede Prozedur die Variablen benötigt, und Du die Prozeduren in einer Klasse zusammenfasst, so dass die Felder nur einmal deklariert und initialisiert werden müssten, würden sich die verschiedenen Prozeduren gegenseitig ihre Variableninhalte zerstören, wenn sie sich gegenseitig aufrufen. Sollte das ausgeschlossen sein, kann man es natürlich so machen, wie Du beschrieben hast. |
Re: wie initialisiert man am besten Variablen-Typen?
Hallo Christian,
ich werde deinen Vorschlag heute Nacht gleich testen wenn ich dann Zeit habe...und vor allem nachschauen WIE das so funktioniert. Sieht aber schon mal sehr gut aus. Hab also vielen Dank und Dir noch ein schönes Wochenende! :cheers: Gruß Jürgen Ps.:
Delphi-Quellcode:
Die Bezeichnungen der Variablen sind für mich eigentlich schlüssig:
Ich bin mir nämlich ziemlich sicher, dass Du in einer Woche deren Bedeutung selber nicht mehr weisst
- zum "aufbröseln" der eingegebenen Zeichen verwende ich (für mich) klare Bezeichnungen. - zum eigentlichen Rechnen verwende ich grundsätzlich die einzelnen Buchstaben als Bezeichner der Variablen. Da die Rechenoperationen eigentlich immer recht simpel sind, braucht man IMHO an der Stelle keine genaueren Bezeichnungen...??? |
Re: wie initialisiert man am besten Variablen-Typen?
Vielleicht schaust du dir auch mal einen Styleguide an. Ich finde den Code recht schwer zu lesen, da du z.b. if, then und begin in die gleiche Zeile schreibst und nicht das begin so eine neue Zeile, dass du das zugehörige end direkt darunter schreibst. So gibt es nämlich auch bei größeren Schachtelungen noch die Möglichkeit jedem end sicher ein begin zuzuordnen. Denn wenn da mal was schiefläuft wird es sehr schwer werden, da den Fehler zu finden und zu korrigieren.
|
Re: wie initialisiert man am besten Variablen-Typen?
@Toxman: Hier geht's nicht um Preise in Schönheit. Wenn dir das Format nicht passt, Du aber etwas Konstruktives beitragen willst, dann kopier dir den Code und DelForExp den einfach. oder JCL formatte, oder Greg's formatte ihn, oder was man sonst noch. Ach ja, früher gabs auch 'Pretty printer'.
Und @juergen: Lass Dir wegen a,b und c nichts einreden. Das ist völlig legitim, das es um einfache Berechnungen geht. Unabhängig davon würde ich stur alle Variablen peu-a-peu initialisieren, so wie Du das mit a,b und c exerziert hast. Allerdings sind 20 lokale Variablen in einer Routine ein Indiz für 'schlechte' Programmierung, bzw. für Dich ein Ansporn, etwas zu verbessern. Etwas aus Faulheit nicht auszucoden, MUSST Du Dir abgewöhnen. Faulheit beim coden ist zwar legitim, sollte aber nur dazu dienen, Fragmente zu zentralisieren: Bevor ich 1000x folgendes schreibe....
Delphi-Quellcode:
baue ich mir eine Routine
....
If not Assigned (fmSomeForm) Then Application.Createform (TfmSomeForm, fmSomeForm) ...
Delphi-Quellcode:
Hier dient die Faulheit zur Erhöhung der Übersichtlichkeit (eine unserer Hauptregel für's Coden).
Procedure CreateForm (aFormClass : TFormClass; Var aForm : TForm);
Begin If not Assigned (Instance) Then Application.Createform (aFormClass, aForm) End; |
Re: wie initialisiert man am besten Variablen-Typen?
Moin Jürgen,
eines noch, was ich vorhin vergessen habe: Statt
Delphi-Quellcode:
solltest Du besser
If Flset = false then begin
Delphi-Quellcode:
Bei booleschen Vergleichen sollte man nie auf gleich true oder gleich false prüfen.
If not Flset then begin
Die andere Variante liest sich IMHO leichter, und in Windows wird meist ein Wert gleich 0 als false angesehen und ungleich 0 als true. |
Re: wie initialisiert man am besten Variablen-Typen?
also die initialisierung von a,b und c ist doch eh überflüddig (wenn ich nichts übershen habe, weil entweder du liest die mit strtofloat ein, oder du machst damit grundsätzlich nichts. In solchen Fällen solltest du grundsätzlich darüber nachdenken, ob du nicht 2 procedures anlegst...
Unterprozeduren gehen so:
Delphi-Quellcode:
wird dir aber hier glaube ich garnicht weiterhelfen. Grundsätzlich ist es aber eben einfach so, dass genau, wie du lokale Variabeln verwendest, kannst du auch lokale Prozeduren verwenden, mit den gleichen Regeln.
procedure myproc;
var a,b,c: double; procedure initvars; begin a :=0; b :=0; c :=0; end; begin //code end; Ich bin mir nicht sicher, ob ich dir das jetzt sagen sollte, weil, wenn mir jemand sowas gesagt hat, hat mich das eigentlich nur genervt, weil ich es eh nicht hinbekommen hätte... Aber gut: Ein kleiner Hinweis am Rande: Es ist besser du leitest dir von TCostumEdit eine Klasse TIntEdit oder so ab, die eine Eigenschaft Value hat (die dir direkt den zum integer konvertierten string gibt) und außerdem verhinderst du noch, dass der user überhaupt etwas anderes eingibt, als zahlen und kommas. Ober gut, kleiner Tipp: Bei ![]() Aber das nur mal so als Tipp für die Zukunft (try-exept ist da nicht das Wahre...). Für den Anfang kannst du es aber dabei belassen... |
Re: wie initialisiert man am besten Variablen-Typen?
Hallo zusammen,
vielen, vielen Dank für die sehr nützlichen, weil konstruktiven Hinweise!!!! Ich bin über Crystal Report zum eigentlichen programmieren gekommen. (das gewünschte Ergebnis hatte ich immer erhalten..., der Rest: naja :oops: ) Aber mir fehlen eben einfach grundlegende Kenntnisse. @ Toxman, super, du hast mir einen schon immmer gesuchten Begriff aufgezeigt --> Styleguide!!!!!! Wenn man nicht weiß wonach man suchen muss.... Hier werde ich wohl vieles nützliches finden! @alzaimar
Delphi-Quellcode:
das war der Hauptgrund meines Postes. Danke!
Hier dient die Faulheit zur Erhöhung der Übersichtlichkeit (eine unserer Hauptregel für's Coden).
@Christian
Delphi-Quellcode:
Zumindestens im Moment fällt mir diese Denkweise noch ziemlich schwer.
If not Flset then begin
Das man bei boolschen Vergleichen nicht auf GLEICH (true oder False) prüfen sollte ist mit komplett neu. Danke für den Hinweis! Ps.: Super! Dein Codevorschlag hat funktioniert! :thumb: Ich kannte bis heute nacht den Typ "Record" nicht. :shock: @yankee Danke für das Aufzeigen, wie Unterproceduren funktionieren!
Delphi-Quellcode:
leider ist das doch nicht so einfach wie es in dieser einen Procedur aussieht:
also die initialisierung von a,b und c ist doch eh überflüddig
1.) kann diese Procedur mehrmals ausgeführt werden, 2.) verwende ich die selben Variablen in den verschiedensten Proceduren
Delphi-Quellcode:
die Eingabe der "richtigen" Zeichen regele ich inzwichen generell über ein OnKeyPress-Ereignis. (allerdings weiß ich nicht ob ich das so lassen werde...) Die Aufbröselung der eingegebenen Zeichen, vor allem das unterscheiden ob ein Trennzeichen eingegeben wurde, ist für die verschiedensten mathem. Rechenoperationen unumgänglich.
und außerdem verhinderst du noch, dass der user überhaupt etwas anderes eingibt, als zahlen und kommas.
Delphi-Quellcode:
Ich habe hier schon einiges über die JVCL gelesen. Im Moment möchte (oder muss) ich mich auf meine wesentlichen Punkte konzentrieren, da ich enorm viel Zeit allein dafür aufwenden muss.
Ober gut, kleiner Tipp: Bei JVCL ist schon sowas fertig dabei,
Also, allen nochmals vielen Dank und noch einen schönen Sonntag! Gruß Jürgen |
Re: wie initialisiert man am besten Variablen-Typen?
Zitat:
Das Problem ist, dass du immer nach einem Boolean fragst. Bloß, wenn du var=3 schreibst, dann machst du daraus einen Boolean:
Delphi-Quellcode:
var
bool: Boolean; int: integer; begin int :=5; bool :=(int=5); if bool then ; //das hier ist das gleiche wie if int=5 then ; //das hier. Man könnte sagen das hier ist eine Kurzschreibweise end; |
Re: wie initialisiert man am besten Variablen-Typen?
@ yankee,
beim erzeugen des Formulars initialisiere ich in meinem Beispiel eine GLOBALE Varible "Flset" auf False. Bei bestimmten Events wird diese Variable dann auf True gesetzt... Man kann diesen Zusammenhang in meiner aufgezeigten Procedure natürlich nicht erkennen. Ein Teil der Variablen sind lokale, ein anderer Teil globale Variablen. Danke für dein Beispiel und viele Grüße Jürgen |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz