![]() |
Step wie noch mal ?
Hab irgendwann schon mal danach gefragt glaube ich.
Find den Thread nicht mehr.
Code:
Wie bekomme ich den Step in Delphi ?
for i = 0 to 100 step 10
gruss Emil |
Re: Step wie noch mal ?
Über eine Whileschleife oder Multiplikation. Eine direkte Möglichkeit gibt es soweit ich weiß nicht.
|
Re: Step wie noch mal ?
Zitat:
Delphi-Quellcode:
gruss Emil
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; |
Re: Step wie noch mal ?
Statt
Code:
entweder das hier:
for i = 0 to 100 step 3 do
begin // ... end;
Delphi-Quellcode:
oder das hier:
i: Integer = 0;
while i <= 100 do begin // ... i := i + 3; end;
Delphi-Quellcode:
;)
for i := 0 to (100 div 3) do
begin // Mach was mit (i * 3) end; |
Re: Step wie noch mal ?
Danke!
werd es mal mit
Delphi-Quellcode:
versuchen.
For dx := 0 To (195 div 3) do
begin // Mach was mit (dx * 3) end; 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:
oder ?
For dx := 0 To 65 do
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 |
Re: Step wie noch mal ?
wie wäre es mit
Delphi-Quellcode:
Das mit dem div verstehe ich ehrlich gesagt nicht :lol:
for i := 0 to 10 do
begin // mach was mit (i*10) end; Sherlock |
Re: Step wie noch mal ?
Zitat:
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 |
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:
Dass da sowas rauskommt:
for i := 0 to 10 step 3 do
showmessage(i); Zitat:
Delphi-Quellcode:
Das da oben wäre dann ungefähr so:
for i := 0 to (10 div 3) do
// oder ausgerechnet: for i := 0 to 3 do showmessage(i * 3);
Delphi-Quellcode:
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)
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; |
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:
Mit einer For-Schleife wird es viel komplizierter.
i := 12;
while i<=51 do begin //... inc(i,7); end; |
Re: Step wie noch mal ?
Zitat:
Danke ;) gruss Emil |
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; |
Re: Step wie noch mal ?
Hallo,
es ist eine technische Spielerei, aber ich konnte einfach nicht widerstehen:
Delphi-Quellcode:
Die Klasse und die Hilfsfunktion Range würde man natürlich in eine eigene Unit verfrachten.
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; Gruß Hawkeye |
Re: Step wie noch mal ?
Zitat:
Delphi-Quellcode:
Edit: Da ich per PN geschimpft wurde, sowas zu zeigen...
Inc(PInteger(@i)^, 2);
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:
Ist 0 nicht gewünscht mit 1 beginnen
for i := 0 to 100 {step 3} do begin
If i mod 3<>0 then continue; // Mach was mit i end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:14 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