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;
Ваши пожелания - ответы тут...