Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Personalausweisnummer generieren (https://www.delphipraxis.net/96367-personalausweisnummer-generieren.html)

Polynom 24. Jul 2007 16:16

Re: Personalausweisnummer generieren
 
Zitat:

Zitat von Gehstock
Die Maximale Zahl kann nur 9*7 sein also 63

Richtig, aber nur für jede einzelne Zahl ...
Jede einzelne Zahl wird mit 7, 3 oder 1 multipliziert. Und wie du richtigerweise gesagt hast ist die größtmögliche Zahl, die hierbei entstehen kann 63. Jetzt nimmt man die letzten Stellen dieser Zahlen und addiert sie (bei deinem Code entspricht die Variable "l" dieser Zahl). Das hierbei größte Ergebnis ist allerdings 216.
(Wenn jede Zahl, welche mit 7 multipliziert werden muss 7 ist, jede, die mit 3 multipliziert werden muss 3 ist und wenn jede Zahl, welche mit 1 multipliziert werden muss 9 ist. Dann wären das 24 Zahlen mit dem Wert 9 = 216)

Außerdem würde ich beim "case ... of"-Bereich noch ein "else i:=0;" einfügen. Dann funktioniert der Code bei meinem Personalausweis.

Gehstock 24. Jul 2007 17:27

Re: Personalausweisnummer generieren
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja hatte ich untedessen auch bemerkt mit der 216

Zitat:

Außerdem würde ich beim "case ... of"-Bereich noch ein "else i:=0;" einfügen.
Dann funktioniert der Code bei meinem Personalausweis
Das war der Fehler
Delphi-Quellcode:
procedure TForm7.Button1Click(Sender: TObject);
var
x,y:integer;
i,l:Integer;
begin
i:=0;
l:=0;
for x := 1 to Length(MaskEdit1.Text)do begin
y:=chartoint(MaskEdit1.Text[x]);
  case x of
  1:i:=y * 7;
  2:i:=y * 3;
  3:i:=y * 1;
  4:i:=y * 7;
  5:i:=y * 3;
  6:i:=y * 1;
  7:i:=y * 7;
  8:i:=y * 3;
  9:i:=y * 1;
 10:i:=y * 7;
 //-
 // Ausgabeland
 //-
 14:i:=y * 3;
 15:i:=y * 1;
 16:i:=y * 7;
 17:i:=y * 3;
 18:i:=y * 1;
 19:i:=y * 7;
 20:i:=y * 3;
 //-
 22:i:=y * 1;
 23:i:=y * 7;
 24:i:=y * 3;
 25:i:=y * 1;
 26:i:=y * 7;
 27:i:=y * 3;
 28:i:=y * 1
  else
  i:=0;
  end;
   l:=l+strtoint(cut(inttostr(i)));
end;
Edit2.Text:=cut(inttostr(l));
end;


Function TForm7.cut(a:string):string;
begin
      if length(a)>1 then Result:=a[2];
      if length(a)>2 then Result:=a[3]
  else
  Result:=a;
end;

function TForm7.CharToInt(C: Char):integer;
begin
  Result := 0;
  if C = '0' then Result := 0;
  if C = '1' then Result := 1;
  if C = '2' then Result := 2;
  if C = '3' then Result := 3;
  if C = '4' then Result := 4;
  if C = '5' then Result := 5;
  if C = '6' then Result := 6;
  if C = '7' then Result := 7;
  if C = '8' then Result := 8;
  if C = '9' then Result := 9;
end;
Danke

@marabu mod war eig net gemeint eher "Pred"

stoxx 24. Jul 2007 17:30

Re: Personalausweisnummer generieren
 
Zitat:

@marabu mod war eig net gemeint eher "Pred"
die ganze Procedure ist ein Fehler *grusel*
Das sind die typischen TForm1-ButtonKlick Programmier.
Wenn es wenigstens einen Hauch von funktionaler Programmierung hätte. Von Objektorientiertheit mal gar nicht zu reden.
Die armen Anfänger, die immer wieder mit so einem Code "belastet" werden ... *seufz*
(Ich gehörte auch mal dazu)

Gehstock 24. Jul 2007 17:33

Re: Personalausweisnummer generieren
 
mag sein aber ich bin am lernen und ich glaub kaum das dei Code am Anfang viel anders aussah
davon abgesehen bei einen Testprogramm bei den ich nur mahl wissen wollte ob und wie ich das hinbekomme reicht mir "Button1Click" zu. Nennt sich Aufwand und Nutzen

stoxx 24. Jul 2007 17:40

Re: Personalausweisnummer generieren
 
Zitat:

Zitat von Gehstock
mag sein aber ich bin am lernen und ich glaub kaum das dei Code am Anfang viel anders aussah
davon abgesehen bei einen Testprogramm bei den ich nur mahl wissen wollte ob und wie ich das hinbekomme reicht mir "Button1Click" zu. Nennt sich Aufwand und Nutzen

gerade das ist falsch, der Aufwand wird bei Deinem Stil irgendwann unkalkulierbar. Vielleicht, weil Du dann ein Projekt nochmal ganz von vorn anfangen musst ....

Vielleicht sollte man in Zukunft TForm1 und ButtonClick Beispiele einfach verbieten :-)
kannst froh sein, dass ich nicht der Boardbetreiber bin :lol:

Gehstock 24. Jul 2007 17:49

Re: Personalausweisnummer generieren
 
Üblicherweise sehen Projekte mit mehr als 1 Button und 2 Edits bei mir so aus
Delphi-Quellcode:
procedure TFormMain.btnCalcClick(Sender: TObject);
var
sie:Integer;
begin
editPhonetyp.Visible:=false;
btnReport.Visible:=false;
memo1.clear;
sie:=strtoint(Copy(editIMEI.Text,1,2));
if ed = false then begin
Memo1.Lines.add('Insert IMEI first');
editIMEI.SetFocus;
  exit;
end;
 if Length(editIMEI.Text) < 17 then begin
  Memo1.Lines.add('Insert IMEI first');
  editIMEI.SetFocus;
  exit;
 end;
CalkImei15;
taco:=StrToInt(Copy(editIMEI.Text,1,6)+Copy(editIMEI.Text,8,2));
ADOQuery1.Close;
if sie < 35 then begin
ADOQuery1.SQL.Text := 'select * from Babt00';
     Database;
end;
if sie = 35 then begin
ADOQuery1.SQL.Text := 'select * from Babt35';
     Database;
end;
if sie >= 36 then begin
ADOQuery1.SQL.Text := 'select * from Babt36';
     Database;
end;
end;

procedure TFormMain.Timer1Timer(Sender: TObject);
begin
  AlphaBlendValue := AlphaBlendValue + 3;
  Timer1.Enabled := AlphaBlendValue < 255;
  if AlphaBlendValue = 255 then editIMEI.SetFocus;
end;

procedure TFormMain.Database;
begin
ADOQuery1.Open;
     While Not ADOQuery1.Eof do
     begin
        if ADOQuery1.FieldByName('Feld1').asinteger =(Taco) then
        begin
           hst:= ADOQuery1.FieldValues['Feld2'];
           modell:=ADOQuery1.FieldValues['Feld3'];
           zula:=ADOQuery1.FieldValues['Feld4'];
           land:=ADOQuery1.FieldValues['Feld5'];
        end;
        ADOQuery1.Next;
     end;
if i15=y then begin
lblCheck.Font.Color := clgreen;
lblCheck.Caption := 'Valid';
btnCorrect.enabled := False;
end else
if i15<>y then begin
lblCheck.Font.Color :=clred;
lblCheck.Caption := 'Invalid';
btnCorrect.enabled := True;
end;    
   if Length(hst) =0  then begin
  memo1.clear;
  memo1.Lines.add('Phone not found. Please Report your TAC ');
  memo1.Lines.add('and your Phonemodel ');
     editPhonetyp.Visible:=true;
     btnReport.Visible:=true;
     editPhonetyp.SetFocus;
     exit;
   end else
 memo1.Lines.add('IMEI : '+editIMEI.Text+' is '+lblCheck.Caption);
 memo1.Lines.add('Manufacturer :'+hst);
 memo1.Lines.add('Model :'+modell);
 memo1.Lines.add('Reg. :'+zula);
 memo1.Lines.add('Country :'+land);
    editIMEI.SetFocus;
    end;

function TFormMain.GetEnv(Variable:string):string;
var buffer:array[1..1024] of char;
begin
if GetEnvironmentVariable( pChar(variable) , @Buffer, Sizeof(buffer) )=0 then
result:=''
else
result:=PathGetLongName(buffer);
end;

function TFormMain.PathGetLongName(const ShortPath: String): String;
var
  GetLongPathName: TGetLongPathName;
  hKernel32: THandle;
begin
  hKernel32 := LoadLibrary(kernel32);
  try
    GetLongPathName := GetProcAddress(hKernel32, 'GetLongPathNameA');
    if not Assigned(GetLongPathName) then RaiseLastWin32Error; //RaiseLastOSError NT / RaiseLastWin32Error 9X
    SetLength(Result, GetLongPathName(PChar(ShortPath), nil, 0));
    SetLength(Result, GetLongPathName(PChar(ShortPath), PChar(Result),
      Length(Result)));
  finally
    FreeLibrary(hKernel32);
  end; {end try/finally}
end;

stoxx 24. Jul 2007 17:54

Re: Personalausweisnummer generieren
 
Zitat:

Zitat von Gehstock
Üblicherweise sehen Projekte mit mehr als 1 Button und 2 Edits bei mir so aus

ach heije ... is ja noch schlimmer!
mach Dir echt mal Gedanken, lese paar Bücher, oder such im Netz.

Versuch mal als erstes, Deinen Code wiederzuverwenden, indem Du einfach mal ein neues Projekt erzeugst, und dort dasselbe integrieren willst. Aber bitte ohne copy und paste und mit völlig anderen Edit Feldern.
Wenn Du das dann gemacht hast, weißt Du, wieviel Aufwand es ist, den Code zu ändern und wiederzuverwenden.
Und vor allen Dingen wirst Du merken, wie schwer es ist, ihn fehlerfrei wiederzuverwenden.

Die 3 Dinge:
Layout - Logik und Datenhaltung immer voneinander trennen, da diese flexibel austauschbar sein müssen und sollen...

Gehstock 24. Jul 2007 18:01

Re: Personalausweisnummer generieren
 
Ach lass gut sein

stoxx 24. Jul 2007 18:04

Re: Personalausweisnummer generieren
 
wollte Dich nicht vergraulen, im Gegenteil ...
Du solltest Dir angewöhnen im TMainForm überhaut nix zu kalkulieren, das ist der falsche Platz dafür.
Ich weiß, der Objektinspektor verführt zu solch einem schlechten Programmierstiel. Ein Klick ist ja leicht gemacht.
In eine Form Unit kommt wirklich nur das allernötigste rein, was man irgendwie zum Anzeigen braucht.
Da wird weder was berechnet, noch mit Daten irgendwas gemacht.
Wenn Du mal auf eine andere Programmiersprache umsteigst, kannst Du mit Deinem Code noch nichtmal was gebrauchen, indem Du was umschreibst ..
Weil, Du wirst dann alles neu machen ....

MaBuSE 25. Jul 2007 07:31

Re: Personalausweisnummer generieren
 
Zitat:

Zitat von stoxx
ach heije ... is ja noch schlimmer!
mach Dir echt mal Gedanken, lese paar Bücher, oder such im Netz.
Versuch mal als erstes, Deinen Code wiederzuverwenden, indem Du einfach mal ein neues Projekt erzeugst, und dort dasselbe integrieren willst. Aber bitte ohne copy und paste und mit völlig anderen Edit Feldern.
Wenn Du das dann gemacht hast, weißt Du, wieviel Aufwand es ist, den Code zu ändern und wiederzuverwenden.
Und vor allen Dingen wirst Du merken, wie schwer es ist, ihn fehlerfrei wiederzuverwenden.
Die 3 Dinge: Layout - Logik und Datenhaltung immer voneinander trennen, da diese flexibel austauschbar sein müssen und sollen...

Hallo Stoxx,
ich bin der Meinung, das man erst mal lernen sollte auf eigenen Füßen zu stehen, als gleich mit dem gehen oder sogar rennen anzufangen.
Das was Gehstock da macht ist schon in Ordnung, für den Anfang.
Er muß ja erst mal verstehen, wie das Ganze überhaupt funktioniert und zusammenhängt.
Wie willst Du z.B. Layout, Logik und Datenhaltung trennen, wenn Du noch gar nicht so genau weißt wie das eigentlich genau funktioniert.
Du hast doch sicherlich auch nicht gleich mit Mutli Tier Anwendungen angefangen um die von Dir angesprochenen 3 Dinge auf 3 verschiedene PCs zu verteilen (Layout auf den Client, Logik in den Application Server und Daten in den SQL Server), sondern mit einem einfachen "Hello World". Und dort ist ja auch der "Hello World" String fest im Code verankert und nicht ausgelagert.

Also erst mal den Leuten erlauben zu stehen, dann durch Beispiele (z.B. Beitrag #15) zeigen wie man gehen kann und wenn die zügig gehen können, kann man ihnen erklären wie mann laufen und rennen kann.
Zitat:

Zitat von stoxx
Die armen Anfänger, die immer wieder mit so einem Code "belastet" werden ... *seufz*
(Ich gehörte auch mal dazu)

Siehst Du, Du hast auch erst mal versucht zu stehen, bevor Du losgerannt bist ;-)
Jeder verwendet nur die Mittel die er kennt. So entstehen manchmal Lösungen die nicht optimal sind. Ich würde aber deshalb nicht von "belastenden" Code sprechen.

Du solltest also lieber Beispiele nach meinem oben genannten Motto erstellen.
Dann gibt es auch mehr "unbelastenden" Code:
Zitat:

Zitat von MaBuSE
Zitat:

Zitat von Gehstock

Ich habe Dir mal den Algorithmus in Pascal geschrieben.
Ich habe versucht ihn möglichst einfach und leicht zu verstehen zu implementieren.
...

Der Algotithmus ist einfach aufgebaut und die Prüfsummenberechnung in eine Funktion ausgelagert.
Das Zitat ist auf dem oben erwähnten Beitrag #15 in diesem Thema.

Zitat:

Zitat von stoxx
wollte Dich nicht vergraulen, im Gegenteil ...

Das will ich Dir hier auch nicht unterstellen.
Ich finde es gut, wenn Du versuchst Leuten zu helfen und Tips zu geben.
Also versteh meine Antwort bitte nicht als dumme Anmache, sondern auch nur als freundlichen Hinweis, bzw. freundlich gemeinte Hilfe von mir.
Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:15 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz