| W3C | XHTML 1.0 |
√ |
|---|
| W3C | CSS 3.0 |
√ |
|---|
2008.09.20
Содержимое это страницы сильно устарело и не поддерживается!
Все замечания по поводу содержимого будут игнорироваться.
Страница оставлена исключительно только для истории.
Эта страничка посвящена программированию на Delphi (под Windows) и Pascal (под DOS). Всё, чего тут касается только следующих языков (версии): Delphi 7 и Turbo Pascal 7.1. Может работать (должно) и в младших версиях - но не ручаюсь за все команды.
Я столкнулся со следующими проблемами при переходе из под DOS'овского Pascal'я в Delphi под Windows.
| Pascal (DOS) | Delphi (Windows) |
|---|---|
| Assign(Fl, 'filename.ext') | AssignFile(Fl, 'filename.ext') |
| Close(Fl) | CloseFile(Fl) |
| Имя типа | Диапазон | Формат |
|---|---|---|
| SmallInt | -32768..32767 | со знаком 16-бит (это "старый" Integer) |
| Cardinal | 0..4294967295 | беззнаковый 32-бита |
| LongWord | 0..4294967295 | беззнаковый 32-бита |
| Int64 | -2^63..2^63-1 | со знаком 64-бита |
| Имя типа | Диапазон | Значащие цифры | Размер в байтах |
|---|---|---|---|
| Real48 | 2.9 x 10^-39 .. 1.7 x 10^38 | 11-12 | 6 (это "старый" Real) |
| Real | 5.0 x 10^-324 .. 1.7 x 10^308 | 15-16 | 8 |
{ из программа EAUnpacker - см. раздел
"B3/\OM" и "X/\AM -> Распакуй файло" }
Var
K, Bl: Byte;
L: LongInt;
...
L:=0;
For K:=3 DownTo 0 Do
Begin
BlockRead(F, Bl, 1);
L:=L+(Bl Shl (8*K)); { обратите внимание на эту строку! }
End;
...
В данном случае Pascal её скомпилирует (ошибки нет) - но будет неправильно вычислять эту строку!
У меня есть подозрение, что он просто пропускает какие-то сложные вложенные операторы...
А вот Delphi - тот считает правильно.
Вычитал в Интернете недавно, что если написать:
L:=L+LongInt(Bl Shl (8*K));
то всё будет работать. Т.е. сделать явное приведение типов. Т.к. оказывается, что в Pascal (насчёт Delphi - не знаю) результат операции зависит только от типа входящих в неё переменных, но не от типа переменной для результата.
Если начали писать под Delphi - то не надо стараться поддерживать принцип "сверху - в низ", т.е. если читаете что-то в память, не заботьтесь об этих 64Кб, используйте SetLength и прочее. Я, например, пишу под Delphi, когда мне нужно чтобы программа поддерживала длинные имена, или чтобы работать с графикой было проще (TBitmap). Несколько советов:
Procedure CreateTextEdit;
Var TextEdit: TEdit;
Begin
TextEdit:=TEdit.Create(TextEdit);
TextEdit.Parent:=Form1; { указываем где рисовать элемент }
TextEdit.Name:='TextEdit1';
End;
{ Свойство Name неплохо задать, чтобы можно было "забить"
на указатель TextEdit и найти нужный элемент через:
Var TextEdit: TEdit;
...
TextEdit:=TEdit(Form1.FindComponent('TextEdit1'));
после чего делаете с TextEdit, что душе угодно...}
Picture:=TBitmap.Create; { создаём объект }
Picture.LoadFromFile('image.bmp'); { что-нибудь делаем с ним }
Picture.Width:=10;
Picture.Height:=10;
Picture.Canvas.Pixels[0,0]:=RGB(255,0,0);
Picture.Free; { чистим память из-под созданного объекта }
Хороший тон, всё же...
{ указываем размер строки! иначе в Delphi
будете писать в память, которой нет!
в Pascal напишите: S[0]:=#4 }
SetLength(S, 4);
{ S[1] - адрес первого элемента строки, т.е. адрес,
начиная с которого нужно писать в память.
не пишите просто S или S[0] - затрёте длину строки! }
BlockRead(Fl, S[1], 4);
Подобным же макаром можно обращаться и с массивами.
Procedure Example;
Var
Arry: Array Of Integer; { массив элементов типа Integer }
I: LongInt;
Begin
SetLength(Arry, 10); { выделяем память под 10 элементов }
{ чего-нибудь с массивом делаем, например, зануляем элементы;
функция Length() работает как и для строк -
возвращает количество элементов;
индексация такого массива всегда начинается с нуля! }
For I:=0 To Length(Arry)-1 Do
Arry[I]:=0;
... { чего-нибудь там ещё делаем }
SetLength(Arry, 0); { в конце уничтожаем массив }
End;
Ваши пожелания - ответы тут...