Весь этот ответ находится в контексте соответствия спецификации, а не того, что движок делает в определенный момент или исторически.
. Фактический вопрос очень расплывчатый.
свойства будут в том же порядке, что я добавил их
В каком контексте?
] Ответ: это зависит от ряда факторов. В общем случае, no .
Иногда да
Здесь вы можете рассчитывать на порядок ключей свойств для простых объектов
:
- ES2015 совместимый движок
- Собственные свойства
Object.getOwnPropertyNames ()
,Reflect.ownKeys ()
,Object.getOwnPropertySymbols (O)
Во всех случаях эти методы включают в себя неперечислимые ключи свойств и ключи заказа, как указано в
[ [OwnPropertyKeys]]
(см. Ниже). Они отличаются типом ключевых значений, которые они включают (String
и / илиСимвол
). В этом контекстеString
включает в себя целочисленные значения.Object.getOwnPropertyNames (O)
Возвращает
O
String
-keyed свойства ( имена свойств ).Reflect.ownKeys (O)
Возвращает
O
собственныеString
- иСимволы
-ключевые свойства.Объект. getOwnPropertySymbols (O)
Возвращает
O
собственныеСимволы
-keyed.[ [OwnPropertyKeys]]
Порядок по существу: целочисленный
Строки
в порядке возрастания, нецелоподобныеСтроки
в создании порядок, Символы в порядке создания. В зависимости от того, какая функция вызывает это, некоторые из этих типов могут не включаться.Специфическим языком является то, что ключи возвращаются в следующем порядке:
- .. каждый собственный ключ свойства
P
изO
[объект, который повторяется], который является целым индексом, в порядке возрастания числового индекса- ... каждый собственный ключ свойства
P
изO
, который является строкой, но не является целым индексом, в порядке создания свойства- ... каждый собственный ключ свойства
P
ofO
, который является символом в порядке создания свойства
Карта
Если вас интересуют упорядоченные карты, вы должны рассмотреть использование типа
Map
, введенного в ES2015, вместо простогообъектов
.
Код, на который вы ссылаетесь, устанавливает преобразование из одного координатного пространства в другое, я не заметил ничего, что бы вырезать / обрезать изображение. Однако вместо того, чтобы иметь коэффициент обратно пропорционального увеличения, я бы предпочел бы, легко понять, линейное масштабирование. Кроме того, я не вижу причин переключать режимы карты в зависимости от коэффициента масштабирования, я бы изменил SetCanvasZoomFactor
следующим образом:
procedure SetCanvasZoomPercent(Canvas: TCanvas; AZoomPercent: Integer);
begin
SetMapMode(Canvas.Handle, MM_ISOTROPIC);
SetWindowExtEx(Canvas.Handle, 100, 100, nil);
SetViewportExtEx(Canvas.Handle, AZoomPercent, AZoomPercent, nil);
end;
Упрощенный (без проверки ошибок) рабочий пример с растровым изображением, загруженным в TImage, масштабированный с помощью TrackBar, может выглядеть следующим образом. Обратите внимание, что вышеуказанная функция встроена в событие OnChange в TrackBar.
type
TForm1 = class(TForm)
imgmain: TImage;
TrackBar1: TTrackBar;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
bmpmain: TBitmap;
[..]
[...]
procedure TForm1.FormCreate(Sender: TObject);
begin
bmpmain := TBitmap.Create;
bmpmain.LoadFromFile(ExtractFilePath('samplebitmap.bmp');
bmpmain.PixelFormat := pf32bit; // No significance, just seems faster here than pf24bit
TrackBar1.Min := 10;
TrackBar1.Max := 200;
TrackBar1.Frequency := 10;
TrackBar1.PageSize := 10;
TrackBar1.Position := 100; // Fires OnChange
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
bmpmain.Free;
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
var
Zoom, x, y: Integer;
begin
Zoom := TrackBar1.Position;
if not (Visible or (Zoom = 100)) or (Zoom = 0) then
Exit;
SetMapMode(imgmain.Canvas.Handle, MM_ISOTROPIC);
SetWindowExtEx(imgmain.Canvas.Handle, 100, 100, nil);
SetViewportExtEx(imgmain.Canvas.Handle, Zoom, Zoom, nil);
x := imgmain.Width * 50 div Zoom - bmpmain.Width div 2;
y := imgmain.Height * 50 div Zoom - bmpmain.Height div 2;
imgmain.Canvas.Draw(x, y, bmpmain);
if (x > 0) or (y > 0) then begin
imgmain.Canvas.Brush.Color := clWhite;
ExcludeClipRect(imgmain.Canvas.Handle, x, y, x + bmpmain.Width, y + bmpmain.Height);
imgmain.Canvas.FillRect(imgmain.Canvas.ClipRect);
end;
Label1.Caption := 'Zoom: ' + IntToStr(TrackBar1.Position) + '%';
end;
type
TForm1 = class(TForm)
TrackBar1: TTrackBar;
Label1: TLabel;
ScrollBox1: TScrollBox;
imgmain: TImage;
procedure FormCreate(Sender: TObject);
procedure TrackBar1Change(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
bmpmain: TBitmap;
[...]
[...]
const
FULLSCALE = 100;
procedure TForm1.FormCreate(Sender: TObject);
begin
imgmain.Left := 0;
imgmain.Top := 0;
bmpmain := TBitmap.Create;
bmpmain.LoadFromFile(ExtractFilePath(Application.ExeName) + '610x.bmp');
bmpmain.PixelFormat := pf32bit;
TrackBar1.Min := FULLSCALE div 10; // %10
TrackBar1.Max := FULLSCALE * 2; // %200
TrackBar1.PageSize := (TrackBar1.Max - TrackBar1.Min) div 19;
TrackBar1.Frequency := TrackBar1.PageSize;
TrackBar1.Position := FULLSCALE;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
bmpmain.Free;
end;
procedure TForm1.TrackBar1Change(Sender: TObject);
var
Zoom: Integer;
begin
Zoom := TrackBar1.Position;
if not (Visible or (Zoom = FULLSCALE)) or (Zoom = 0) then
Exit;
SetMapMode(imgmain.Canvas.Handle, MM_ISOTROPIC);
SetWindowExtEx(imgmain.Canvas.Handle, FULLSCALE, FULLSCALE, nil);
SetViewportExtEx(imgmain.Canvas.Handle, Zoom, Zoom, nil);
imgmain.Width := Round(bmpmain.Width * Zoom / FULLSCALE);
imgmain.Height := Round(bmpmain.Height * Zoom / FULLSCALE);
if Assigned(imgmain.Picture.Graphic) then begin
imgmain.Picture.Graphic.Width := imgmain.Width;
imgmain.Picture.Graphic.Height := imgmain.Height;
end;
imgmain.Canvas.Draw(0, 0, bmpmain);
Label1.Caption := 'Zoom: ' +
IntToStr(Round(TrackBar1.Position / FULLSCALE * 100)) + '%';
end;
imgmain.Canvas.Draw(x,y,bmpmain)
будет рисовать 1 & quot; ширину растрового изображения на TImage. В режиме изотропного отображения, если вы установите размер горизонтального окна на 100 и горизонтальную область просмотра до 200, вы говорите, что 100 логических единиц на оси x будут представлены с 200px. Таким образом, один и тот же вызов будет рисовать растровое изображение 192px или 2 " или в два раза больше ширины. – Sertac Akyuz 14 June 2010 в 10:34imgmain.Width := bmpmain.Width * Zoom div 100;
– Sertac Akyuz 14 June 2010 в 10:59