Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Step wie noch mal ? (https://www.delphipraxis.net/132994-step-wie-noch-mal.html)

EWeiss 23. Apr 2009 13:13


Step wie noch mal ?
 
Hab irgendwann schon mal danach gefragt glaube ich.
Find den Thread nicht mehr.

Code:
for i = 0 to 100 step 10
Wie bekomme ich den Step in Delphi ?

gruss Emil

Namenloser 23. Apr 2009 13:14

Re: Step wie noch mal ?
 
Über eine Whileschleife oder Multiplikation. Eine direkte Möglichkeit gibt es soweit ich weiß nicht.

EWeiss 23. Apr 2009 13:19

Re: Step wie noch mal ?
 
Zitat:

Zitat von NamenLozer
Über eine Whileschleife oder Multiplikation. Eine direkte Möglichkeit gibt es soweit ich weiß nicht.

Wie soll ich das hier verwirklichen fällt mir nix ein .. :wall:

Delphi-Quellcode:
procedure TfrmDraw.FadeBackBuffer;
var
 dx : Integer;
 dy : Integer;
 r : Integer;
 g : Integer;
 b : Integer;
begin

    BitBlt(hTempDc, 0, 0, 65, 63, DC, 0, 0, SRCCOPY);
    //' Copy The R,G,B Data Into Our Image Array For Rapid Editing/Fading.
    CopyMemory(@ia[0,0], pAddr, 49152);
    //' Fade The Data.
    For dy := 0 To 62 do
    begin
        For dx := 0 To 195 do //(Step 3)
        begin
            b := ia[dx, dy] - 15;
            If b < 0 Then
                b := 0;

            ia[dx, dy] := b;

            g := ia[dx + 1, dy] - 15;
            If g < 0 Then
                g := 0;

            ia[dx + 1, dy] := g;

            r := ia[dx + 2, dy] - 15;
            If r < 0 Then
                r := 0;

            ia[dx + 2, dy] := r;
        end;
    end;
    //' Copy Edited Image Back To Dib Section.
    CopyMemory(pAddr, @ia[0,0], 49152);
    //' Blit The Faded Image To The Back Buffer.
    BitBlt(DC, 0, 0, 65, 63, hTempDc, 0, 0, SRCCOPY);


end;
gruss Emil

jfheins 23. Apr 2009 13:25

Re: Step wie noch mal ?
 
Statt
Code:
for i = 0 to 100 step 3 do
begin
  // ...
end;
entweder das hier:
Delphi-Quellcode:
i: Integer = 0;
while i <= 100 do
begin
  // ...
  i := i + 3;
end;
oder das hier:
Delphi-Quellcode:
for i := 0 to (100 div 3) do
begin
  // Mach was mit (i * 3)
end;
;)

EWeiss 23. Apr 2009 13:29

Re: Step wie noch mal ?
 
Danke!
werd es mal mit
Delphi-Quellcode:
For dx := 0 To (195 div 3) do
begin
  // Mach was mit (dx * 3)
end;
versuchen.

EDIT:
Obwohl ich dann eigentlich direkt 65 angeben kann
Er soll aber alle 65 pixel die schleife ablaufen.

Dein Beispiel ist das gleiche wie
Delphi-Quellcode:
For dx := 0 To 65 do
oder ?
Wann bearbeitet er aber 130 und 195 ?
also einmal von 0 > 65 dann von 65 > 130 usw..
Das wäre so aber nicht möglich mit DIV 3

gruss Emil

Sherlock 23. Apr 2009 13:50

Re: Step wie noch mal ?
 
wie wäre es mit
Delphi-Quellcode:
for i := 0 to 10 do
begin
  // mach was mit
  (i*10)
end;
Das mit dem div verstehe ich ehrlich gesagt nicht :lol:

Sherlock

EWeiss 23. Apr 2009 13:58

Re: Step wie noch mal ?
 
Zitat:

Zitat von Sherlock
wie wäre es mit
Delphi-Quellcode:
for i := 0 to 10 do
begin
  // mach was mit
  (i*10)
end;
Das mit dem div verstehe ich ehrlich gesagt nicht :lol:

Sherlock

habs ja geschrieben :)
For dx := 0 To 65 do

Das problem ist aber immer noch das gleiche.
Es nutzt mir nichts die daten i*3 zu nehmen denn zuerst sollen die ersten
65 pixel dann die von 65 > 130 und dann die von 130 > 195 verarbeitet werden
das geht aber mit i*3 nicht.

gruss Emil

jfheins 23. Apr 2009 14:02

Re: Step wie noch mal ?
 
@Sherlock: Das mit dem div ist das, was du "im Kopf" gemacht hast: Es rechnet die Anzahl der Durchläufe aus, die notwendig sind.

@Emil: Das verstehe ich jetzt nicht mehr :gruebel:

Ich dachte du meinst mit

Code:
for i := 0 to 10 step 3 do
showmessage(i);
Dass da sowas rauskommt:
Zitat:

0 3 6 9
Dann wäre das hier equivalent:
Delphi-Quellcode:
for i := 0 to (10 div 3) do
// oder ausgerechnet: for i := 0 to 3 do
showmessage(i * 3);
Das da oben wäre dann ungefähr so:
Delphi-Quellcode:
For dx := 0 To (195 div 3) do //(Step 3)
        begin
            b := ia[(dx * 3), dy] - 15;
            If b < 0 Then
                b := 0;

            ia[(dx * 3), dy] := b;

            g := ia[(dx * 3) + 1, dy] - 15;
            If g < 0 Then
                g := 0;

            ia[(dx * 3) + 1, dy] := g;

            r := ia[(dx * 3) + 2, dy] - 15;
            If r < 0 Then
                r := 0;

            ia[(dx * 3) + 2, dy] := r;
        end;
Die Variable dx durchläuft den Bereich von 0 bis 65 - da du aber beid jeder Verwendung (dx * 3) nimmt, bekommst du den Bereich 0..195 in Dreierschritten (lies: 0, 3, 6, 9, 12, 15, ..., 195)

gammatester 23. Apr 2009 14:09

Re: Step wie noch mal ?
 
Ich schlage trotzdem vor, eine While-Schleife zu nehmen, sonst muß man ev. ziemlich viel rechnen: for i=12 to 51 step 7 wird dann einfach zu:
Delphi-Quellcode:
i := 12;
while i<=51 do begin
  //...
  inc(i,7);
end;
Mit einer For-Schleife wird es viel komplizierter.

EWeiss 23. Apr 2009 14:13

Re: Step wie noch mal ?
 
Zitat:

@Emil: Das verstehe ich jetzt nicht mehr
Sorry ist korrekt in 3 schritten also 3,6,9 usw..
Danke ;)

gruss Emil

himitsu 23. Apr 2009 14:16

Re: Step wie noch mal ?
 
Delphi-Quellcode:
for i := 0 to 100 {step 3} do
begin
  // mach was mit i

  i := i + 2; // es gibt einen Hack, womit man die Variable sezten kann,
  // aber da muß man aufpassen, denn daß hier wird eine "Endlosschleife",
  // da die Abbruchbedingung i=100 nicht erreicht wird > 93 96 99 102 ...
end;

Hawkeye219 23. Apr 2009 15:43

Re: Step wie noch mal ?
 
Hallo,

es ist eine technische Spielerei, aber ich konnte einfach nicht widerstehen:

Delphi-Quellcode:
type
  TLoop = class
  private
    FFrom   : Integer;
    FTo     : Integer;
    FStep   : Integer;
    FCurrent : Integer;
  public
    constructor Create (const aFrom, aTo: Integer);
    function MoveNext: Boolean;
    function Step (const aStep: Integer): TLoop;
    function GetEnumerator: TLoop;
    property Current: Integer read FCurrent;
  end;

constructor TLoop.Create (const aFrom, aTo: Integer);
begin
  FFrom := aFrom;
  FTo := aTo;
  Step(1);
end;

function TLoop.Step (const aStep: Integer): TLoop;
begin
  FStep := aStep;
  FCurrent := FFrom - FStep;

  Result := Self;
end;

function TLoop.GetEnumerator: TLoop;
begin
  Result := Self;
end;

function TLoop.MoveNext: Boolean;
begin
  Inc (FCurrent, FStep);

  if (FStep < 0) then
    Result := (FCurrent >= FTo)
  else
    Result := (FCurrent <= FTo);
end;


function Range (const aFrom, aTo: Integer): TLoop;
begin
  Result := TLoop.Create(aFrom, aTo);
end;

// Anwendung:

procedure TForm1.btnEnumeratorClick (Sender: TObject);
var
  i : Integer;
begin
  Memo.Clear;

  for i in Range(12, 51).Step(7) do
    Memo.Lines.Add (IntToStr(i));

  Memo.Lines.Add('');

  for i in Range(20, 0).Step(-3) do
    Memo.Lines.Add (IntToStr(i));
end;
Die Klasse und die Hilfsfunktion Range würde man natürlich in eine eigene Unit verfrachten.

Gruß Hawkeye

Sunlight7 23. Apr 2009 19:49

Re: Step wie noch mal ?
 
Zitat:

Zitat von himitsu
Delphi-Quellcode:
for i := 0 to 100 {step 3} do
begin
  // mach was mit i

  i := i + 2; // es gibt einen Hack, womit man die Variable sezten kann,
  // aber da muß man aufpassen, denn daß hier wird eine "Endlosschleife",
  // da die Abbruchbedingung i=100 nicht erreicht wird > 93 96 99 102 ...
end;

Du meinst (falls man nen Integer als i hat)

Delphi-Quellcode:
  Inc(PInteger(@i)^, 2);
Edit: Da ich per PN geschimpft wurde, sowas zu zeigen...
Ne so schlimm war die PN nich, aber hier halt ein Hinweis zum beachten:
Manipuliert man Delphis Schleifenvariable, kann dies zu unerwünschten Ergebnissen,
wie zB. Endlosschleifen und AVs führen.
Man sollte dies nur machen, wenn man genau weiß was man macht, oder gleich die Finger davon lassen.
:mrgreen:

Noch eine saubere Methode:

Delphi-Quellcode:
   for i := 0 to 100 {step 3} do begin
   If i mod 3<>0 then continue;

   // Mach was mit i
end;
Ist 0 nicht gewünscht mit 1 beginnen


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:21 Uhr.

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