Das ',' ersetzt folgende Schreibweise:hier wird anscheinend immer der zuletzt aufgeführte Parameter benutzt.
Code: Alles auswählen
with Button1, Button2 do
// ist gleich:
with Button1 do with Button2 do
Das ',' ersetzt folgende Schreibweise:hier wird anscheinend immer der zuletzt aufgeführte Parameter benutzt.
Code: Alles auswählen
with Button1, Button2 do
// ist gleich:
with Button1 do with Button2 do
Da kann man aber auch eins meiner Lieblings pascal features verwenden, geschachtelte Methoden:m.fuchs hat geschrieben: Wenn du Blöcke abtrennen möchtest, dann verwende doch einfach mal Methoden.
Aber ich finde es gut, dass die Diskussion aufgekommen ist. So konnte ich gleich mal meine Code-Quality-Checks um ein Verbot von with...do erweitern.
Code: Alles auswählen
procedure TFooBar.Foo(Params);
type
// Typen
var
// Variablen
const
// Konstanten
// Subfunktionen:
procedure Bar(Params2);
//...
begin
end;
type
// Typen
var
// Variablen
const
// Konstanten
begin
Bar(Params to be passed);
end;
Code: Alles auswählen
procedure QuickSort(Arr: TIntegerArray);
procedure QuickSortHelper(H, L: Integer);
begin
// Qicksort auf arr
end;
begin
QuickSortHelper(High(Arr), Low(Arr));
end;
Ja das wäre deutlich schöner. Kaum zu glauben das Visual Basic in irgendetwas sauberer ist.m.fuchs hat geschrieben:Ja, da ist das in Visual Basic.NET wirklich sauberer gelöst.
Der Unterschied ist, wenn man geschachtelte Methoden verwendet, dann weiß man meist warum man das tut und passt entsprechend auf "wie ein Haftelmacher".Warf hat geschrieben: Da kann man aber auch eins meiner Lieblings pascal features verwenden, geschachtelte Methoden:
Code: Alles auswählen
With MyObj do Caption:='With ist blöd';
Findest du da with immer noch blöd ?Code: Alles auswählen
Code: Alles auswählen
WriteLn(
'RedPrc: ', Image1.Picture.Bitmap.RawImage.Description.RedPrec,
' RedShift: ', Image1.Picture.Bitmap.RawImage.Description.RedShift,
' GreenPrec: ', Image1.Picture.Bitmap.RawImage.Description.GreenPrec,
' Green: ', Image1.Picture.Bitmap.RawImage.Description.GreenShift,
' BluePrec: ', Image1.Picture.Bitmap.RawImage.Description.BluePrec,
' BlueShift: ', Image1.Picture.Bitmap.RawImage.Description.BlueShift);
// oder
with Image1.Picture.Bitmap.RawImage.Description do begin
WriteLn('RedPrc: ', RedPrec, ' RedShift: ', RedShift,
' GreenPrec: ', GreenPrec, ' Green: ', GreenShift,
' BluePrec: ', BluePrec, ' BlueShift: ', BlueShift);
end;
Obwohl ich bezüglich "with" nicht so puritanisch eingestellt bin, wie manche meiner Vor-"Poster", und gelegentliches "with" (wenn alles klar ist) zulasse, hätte ich das nie so gemacht, sondern hätte stattdessen eine Zwischenvariable deklariert, die mir im Fall des Falles auch einfachen Zugriff durch den Debugger erlaubt:Mathias hat geschrieben:Findest du da with immer noch blöd ?
Code: Alles auswählen
var
desc: TRawImageDescription;
...
desc := Image1.Picture.Bitmap.RawImage.Description;
WriteLn(
'RedPrc: ', desc.RedPrec,
' RedShift: ', desc.RedShift,
' GreenPrec: ', desc.GreenPrec,
' Green: ', desc.GreenShift,
' BluePrec: ', desc.BluePrec,
' BlueShift: ', desc.BlueShift);
Code: Alles auswählen
var
img: TRawImage;
...
img := Image1.Picture.Bitmap.RawImage;
WriteLn(
'RedPrc: ', img.Description.RedPrec,
' RedShift: ', img.Description.RedShift,
' GreenPrec: ', img.Description.GreenPrec,
' Green: ', img.Description.GreenShift,
' BluePrec: ', img.Description.BluePrec,
' BlueShift: ', img.Description.BlueShift);
Dir ist aber bewusset, das du etwas mehr als nur einen Pointer kopierst ?sondern hätte stattdessen eine Zwischenvariable deklariert, die mir im Fall des Falles auch einfachen Zugriff durch den Debugger erlaubt:
Code: Alles auswählen
var
desc: TRawImageDescription;
img: TRawImage;
begin
WriteLn(SizeOf(desc)); // --> 68
WriteLn(SizeOf(img)); // --> 120
Sowas wäre in dieser Art wäre doch eine Lösung:mse hat geschrieben:Auf die Gefahr hin dass ich mich wiederhole:
Free Pascal braucht eine sichere "with" Variante.
Es wird seit über zehn Jahren immer wieder diskutiert und Luca Olivetti zeigt jeweils einen uralt Pascal Dialekt der ein entsprechendes Konstrukt zur Verfügung stellt - alles ohne Wirkung.
Code: Alles auswählen
{$NewWidth}
with Canvas do begin
.Line(0, 0, 100, 100);
end;
Ja, da gebe ich dir recht.mse hat geschrieben:Auf die Gefahr hin dass ich mich wiederhole:
Free Pascal braucht eine sichere "with" Variante.