Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Strings mit Parameter in einer Konsolanwendung (https://www.delphipraxis.net/166323-strings-mit-parameter-einer-konsolanwendung.html)

Back2Code 8. Feb 2012 07:30

Strings mit Parameter in einer Konsolanwendung
 
Ich lerne seit ein paar Wochen Delphi und bin gerade dabei eine kleine Konsolen Anwendung zu schreiben. Zur Zeit sieht mein Code so aus :

Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var VName,NName:String;
     PPasswort:String;


begin
WriteLn('################################Login###########################################');
WriteLn; //Eine Zeile auslassen
PPasswort:='';
begin
WriteLn('root@localhost ~ Insert password');
ReadLn(PPasswort);
CompareStr(PPasswort, '1337');
if(CompareStr(PPasswort, '1337') = 0) then
WriteLn('*Access granted*')
else begin
WriteLn('*Access denied*');
Sleep(2000);
exit;
end;
end;
WriteLn; //Eine Zeile auslassen
WriteLn('Wie lautet dein Vorname?');
ReadLn(VName);
WriteLn('Wie lautet dein Nachname?');
ReadLn(NName);
WriteLn;
WriteLn('Willkommen '+VName+' '+NName+'.');
ReadLn;
end.
Ich habe jetzt vor nach dem "Willkommen" eine String Wiederholungfunktion einzubauen mit Parameter.

Als Beispiel :

repeatstr Teststring 99 = Würde jetzt "Teststring" 99 mal hintereinander in der Console schreiben...

Meine Frage ist jetzt wie ich das am besten umsetzen könnte.

:thumb:

Coffeecoder 8. Feb 2012 07:35

AW: Strings mit Parameter in einer Konsolanwendung
 
Zitat:

Zitat von Robin2k (Beitrag 1149798)

Ich habe jetzt vor nach dem "Willkommen" eine String Wiederholungfunktion einzubauen mit Parameter.

Hi, du sagst ja schon selbst: Die schreibt eine Funktion resp eine Prozedur dafür:
Delphi-Quellcode:
procedure wiederholen(wiederholungen : integer; text : String);
var i : integer;
begin
  for i := 1 to wiederholungen do
  begin
    writeln(text);
  end;
end;
P.S. : Willkommen in der :dp:

Back2Code 8. Feb 2012 08:04

AW: Strings mit Parameter in einer Konsolanwendung
 
So atm sieht mein Code jetzt so aus :

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var text:String;
    wiederholungen:integer;
    var i : integer;

begin
WriteLn('Usage: repeatstr [string] [repeats]');
ReadLn(text);
ReadLn(wiederholungen);
begin
  for i := 0 to wiederholungen do
  begin
    writeln(text);
  end;
  end;
end.
Wie kann ich text & wiederholungen in einer Zeile auslesen?

himitsu 8. Feb 2012 08:33

AW: Strings mit Parameter in einer Konsolanwendung
 
Zitat:

Zitat von Robin2k (Beitrag 1149803)
Wie kann ich text & wiederholungen in einer Zeile auslesen?

Du hast dir doch bestimmt schonmal die OH und einige Tutorials angesehn?

Dann ist dir bestimmt aufgefallen, daß WriteLn mehrere Parameter kann. :zwinker:
Delphi-Quellcode:
WriteLn(IntToStr(Wiederholungen) + Text);

WriteLn(Wiederholungen, Text);

Write(IntToStr(Wiederholunge));
Write(Text);
WriteLn;

Write(Wiederholunge);
Write(Text);
WriteLn;

Write(IntToStr(Wiederholunge));
WriteLn(Text);

Write(Wiederholunge);
WriteLn(Text);

uvm.
Was ich dir aber noch dringen anraten würde:
Codformatierung nutzen ... schon ist der code übersichtlicher/verständlicher. (der Code aus Post #1 ist irgendwie grausam)

Delphi-Quellcode:
CompareStr(PPasswort, '1337');
if(CompareStr(PPasswort, '1337') = 0) then
Was macht das nutzlose CompareStr dort? Also das vovon der Rückgabewert nicht ausgewertet wird.

Delphi-Quellcode:
if CompareStr(PPasswort, '1337') = 0 then

if not SameStr(PPasswort, '1337') then

if PPasswort <> '1337' then
Mal so aus privatem Interesse: Was haben eigentlich die Prefixe V, N und P, bei den Variablen, für eine Bedeutung?

[edit]
OK, V und N hab ich grade bemerkt, aber warum heißen die Variablen dann nicht gleich Vorname und Nachname?

Sir Rufo 8. Feb 2012 08:40

AW: Strings mit Parameter in einer Konsolanwendung
 
Also der Code ist ja grauslich formatiert :)

Warum die Funktion nicht so benennen wie der TE das schon vorgeschlagen hat?
Und einen String Parameter nach Möglichkeit immer als
Delphi-Quellcode:
const
definieren.

Delphi-Quellcode:
program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var
  VName, NName : String;
  Passwort    : String; // PPasswort würde eigentlich auf einen Pointer schließen lassen

function RepeatStr( const Str : string; Count : integer ) : string;
var
  idx : integer;
begin
  Result := '';
  for idx := 1 to Count do
    Result := Result + Str;
end;

begin
  WriteLn( '################################Login###########################################' );
  WriteLn; //Eine Zeile auslassen
  Passwort := '';

  begin // <= ist überflüssig

    WriteLn( 'root@localhost ~ Insert password' );
    ReadLn( Passwort );

    CompareStr( Passwort, '1337' ); // <= ist überflüssig

    if
      ( CompareStr( Passwort, '1337' ) = 0 )
    then
      WriteLn( '*Access granted*' )
    else
      begin
        WriteLn( '*Access denied*' );
        Sleep( 2000 );
        exit;
      end;

  end; // <= ist so überflüssig, wie das begin weiter oben

  WriteLn; //Eine Zeile auslassen
  WriteLn( 'Wie lautet dein Vorname?' );
  ReadLn( VName );
  WriteLn( 'Wie lautet dein Nachname?' );
  ReadLn( NName );
  WriteLn;
  WriteLn( 'Willkommen ' + VName + ' ' + NName + '.' );

  // Aufruf der Funktion mit gleichzeitiger Ausgabe
  WriteLn( RepeatStr( 'Teststring', 99 ) );

  ReadLn;
end.

Back2Code 8. Feb 2012 09:57

AW: Strings mit Parameter in einer Konsolanwendung
 
Funktioniert jetzt einigermaßen wie ichs wollte..ich wundere mich etwas, da die Binary jetzt über 1 MB groß ist :shock: Gibts da ein paar Tricks wie ich die kleiner bekomme?

Sir Rufo 8. Feb 2012 10:08

AW: Strings mit Parameter in einer Konsolanwendung
 
Wenn du dein Profil dahingehend anpassen würdest, mit welcher Delphi-Version du arbeitest, dann wäre das sehr hilfreich ;)

Vermutlich erzeugst du eine Debug-Version ... mit eben all den Debug-Informationen, und dass lässt natürlich die erzeugte exe anwachsen :)

Back2Code 8. Feb 2012 10:21

AW: Strings mit Parameter in einer Konsolanwendung
 
Danke für den Tipp. Jetzt sind's nur noch 130 kb.

Sir Rufo 8. Feb 2012 10:51

AW: Strings mit Parameter in einer Konsolanwendung
 
Einen großen Teil macht dabei
Delphi-Quellcode:
SysUtils
aus (ca. 100KB).

Dieses kann man vermeiden, wenn man gezielt auf Teile von SysUtils verzichtet oder nur die benötigten Teile in eine eigene Unit auslagert.

Delphi-Quellcode:
program ConsoleTest;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  // System.SysUtils;

  // statt der sehr großen SysUtils nehmen wir unsere eigene

  uSmallSysUtils in 'uSmallSysUtils.pas';

var
  VName, NName : String;
  Passwort :    String; // PPasswort würde eigentlich auf einen Pointer schließen lassen

function RepeatStr( const Str : string; Count : integer ) : string;
var
  idx : integer;
begin
  Result  := '';
  for idx := 1 to Count do
    Result := Result + Str;
end;

begin
  WriteLn( '################################Login###########################################' );
  WriteLn; // Eine Zeile auslassen
  Passwort := '';

  WriteLn( 'root@localhost ~ Insert password' );
  ReadLn( Passwort );

  // statt SysUtils.CompareStr vergleichen wir so

  if ( Passwort <> '1337' )
  then
    WriteLn( '*Access granted*' )
  else
    begin
      WriteLn( '*Access denied*' );
      Sleep( 2000 );
      exit;
    end;

  WriteLn; // Eine Zeile auslassen
  WriteLn( 'Wie lautet dein Vorname?' );
  ReadLn( VName );
  WriteLn( 'Wie lautet dein Nachname?' );
  ReadLn( NName );
  WriteLn;
  WriteLn( 'Willkommen ' + VName + ' ' + NName + '.' );

  // Aufruf der Funktion mit gleichzeitiger Ausgabe
  WriteLn( RepeatStr( 'Teststring', 99 ) );

  ReadLn;

end.
und die uSmallSysUtils.pas sieht dann so aus (ist halt nur die Sleep-Funktion)
Delphi-Quellcode:
unit uSmallSysUtils;

interface

procedure Sleep(milliseconds: Cardinal);{$IFDEF MSWINDOWS} stdcall; {$ENDIF}
{$IFDEF MSWINDOWS}
(*$EXTERNALSYM Sleep*)
{$ENDIF}

implementation

{$IFDEF MSWINDOWS}
procedure Sleep; external 'kernel32.dll' name 'Sleep'; stdcall;
{$ENDIF MSWINDOWS}
{$IFDEF POSIX}

procedure Sleep( milliseconds : Cardinal );
begin
  usleep( milliseconds * 1000 ); // usleep is in microseconds
end;
{$ENDIF POSIX}

end.
Jetzt ist die Release-Version nur noch 32KB groß ... aber ...

grundsätzlich sollte man gerade als Anfänger davon erstmal absehen :)

himitsu 8. Feb 2012 11:17

AW: Strings mit Parameter in einer Konsolanwendung
 
Wobei die paar 118 98 KB heutzutage ja kaum noch auffallen.
(da kann man schonmal zwischen Aufwand und Nutzen abwägen)

Sir Rufo 8. Feb 2012 11:27

AW: Strings mit Parameter in einer Konsolanwendung
 
Zitat:

Zitat von himitsu (Beitrag 1149847)
Wobei die paar 118 KB heutzutage ja kaum noch auffallen.
(da kann man schonmal zwischen Aufwand und Nutzen abwägen)

Wie kommst du auf 118KB? Nach meiner Rechnung wären es 98KB Unterschied ;)

Aber du hast da völlig Recht, ich bin noch nie in Verlegenheit gekommen die SysUtils so zu strippen ... weil es mir einfach egal war :mrgreen: und auch bei der Gesamtgröße keine Geige gespielt hat.

himitsu 8. Feb 2012 11:30

AW: Strings mit Parameter in einer Konsolanwendung
 
falschrum gedacht, beim Kopfrechnen Schätzen :oops:

JamesTKirk 8. Feb 2012 15:24

AW: Strings mit Parameter in einer Konsolanwendung
 
Zitat:

Zitat von Robin2k (Beitrag 1149803)
Wie kann ich text & wiederholungen in einer Zeile auslesen?

Du möchtest also

Code:
repeatstr text wiederholungen
statt

Code:
repeatstr
text
wiederholungen
?

Dann würde ich dir mal empfehlen dir die Funktionen
Delphi-Quellcode:
ParamCount
und
Delphi-Quellcode:
ParamStr
anzuschauen.
Delphi-Quellcode:
ParamCount
gibt dabei die Anzahl der an die Anwendungen übergebenen Parameter wieder (im Fall von Hello World "Some Other Text" wäre das "3") und mit
Delphi-Quellcode:
ParamStr
liest du den jeweiligen Parameter aus, wobei
Delphi-Quellcode:
ParamStr(0)
dir den Pfad deiner Anwendung zurückgibt (
Delphi-Quellcode:
ParamStr(1)
ist damit der erste Parameter).

Gruß,
Sven


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:39 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-2025 by Thomas Breitkreuz