Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на Delphi


Информационный Канал Subscribe.Ru

РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 239
от 15.09.2005, 22:12

Администратор:Калашников О.А.
В рассылке:Подписчиков: 244, Экспертов: 52
В номере:Вопросов: 3, Ответов: 14


Вопрос № 26121: Товарищи!!! Помогите! Я пытаюсь создать игру. Графическую часть карты я хотел бы составить из уже существующих 4-х картинок-тайлов, но как это сделать? Было бы неплохо, чтобы после эту картинку-карту присвоить Image, сохранить в ImageList или же хот...
Вопрос № 26132: Здравствуйте эксперты. Пожалуйста подскажите как получить код ошибки. на вот это: {$I-} AssignFile(f,fName); Reset(f); {$I+} Edit2.Text := IntToStr(IOResult); Программа (если файл не существует) выводит сообщение ...
Вопрос № 26146: Нет ли у StringGrid какого нибудь метода, чтобы разом очистить все ячейки??? И как выровнять содержимое в ячейке по центру по вертикали и по горизонтали???? Как можно сделать чтобы в куче однотипных объектов к ним можно было обращат...

Вопрос № 26.121
Товарищи!!! Помогите! Я пытаюсь создать игру. Графическую часть карты я хотел бы составить из уже существующих 4-х картинок-тайлов, но как это сделать? Было бы неплохо, чтобы после эту картинку-карту присвоить Image, сохранить в ImageList или же хотя бы сохранить на диске. И вообще как можно программно редактировать картинки? Ну, например, берём большую картинку, а по центру помещаем другую размером поменьше и итог сохранить или вывести.
Отправлен: 10.09.2005, 00:49
Вопрос задал: Puld (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: sir henry
Здравствуйте, Puld!
С помощью функции CopyRect(RectDestination: TRect; Canvas: TCanvas; RectSource: TRect);
Т.е. загрузить в память четыре картинки, а потом с помощью этой функции вставлять прямоугольники (Rect) выбраного размера.
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 12.09.2005, 05:49

Отвечает: zer0access
Здравствуйте, Puld!
Я так понимаю, тебя интересует создание игр именно на Delphi? А с использованием OpenGL или DirectX? Насколько я понял, ты хочешь использовать только обычный GDI Windows. Могу посоветовать хорошие сайты по разработке игр.
http://delphigfx.mastak.ru/ - замечательный сайт, на котором куча информации, примеров, статей.
http://gamedev.ru/ - сайт, полностью посвящённый разработке игр.
---------
feel the texture... of nature...
Ответ отправил: zer0access (статус: Студент)
Отправлен: 12.09.2005, 23:01


Вопрос № 26.132
Здравствуйте эксперты.
Пожалуйста подскажите как получить код ошибки.
на вот это:
{$I-}
AssignFile(f,fName);
Reset(f);
{$I+}
Edit2.Text := IntToStr(IOResult);
Программа (если файл не существует) выводит сообщение
Couldn't find file "Имя_файла" , a в Edit2.Text код ошибки так и не выходит.
Отправлен: 10.09.2005, 11:46
Вопрос задал: Teapot (статус: Посетитель)
Всего ответов: 8
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: John Freeman
Здравствуйте, Teapot!
убери всё из комментариев и сделай try excpt , тогда покажет, а так не делают, пусть и написано.
Type Switch
Syntax {$I+} or {$I-}
{$IOCHECKS ON} or {$IOCHECKS OFF}
Default {$I+}
{$IOCHECKS ON}
Scope Local
Remarks

The $I switch directive enables or disables the automatic code generation that checks the result of a call to an I/O procedure. I/O procedures are described in the Delphi Language Guide. See Standard routines and I/O. If an I/O procedure returns a nonzero I/O result when this switch is on, an EInOutError exception is raised (or the program is terminated if exception handling is not enabled). When this switch is off, you must check for I/O errors by calling IOResult.

P.S. try except в любом случае делать надо.
---------
Ik bin ulien spiegel!
Ответ отправил: John Freeman (статус: Профессор)
Отправлен: 12.09.2005, 01:19

Отвечает: sir henry
Здравствуйте, Teapot!
Да вроде все правильно. Попробуйте сначала результат функции сохранить в переменную, т.к. после считывания результата код ошибки сбрасывается.
var
f: TextFile;
ioerror: integer;
Begin
AssignFile(f, fName);
{$I-}
Reset(f);
{$I+}
ioerror:=IOResult;
Edit2.Text:=IntToStr(ioerror);
End;
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 12.09.2005, 05:57

Отвечает: Romodos
Здравствуйте, Teapot!
Странно, я вставил ваш код в программу - всё работает, т.е. edit2 отображает значение Ioresult;
0 - ВСЁ успешн, остальные значения - ошибка
И программа никакие сообщения не должна выводить
Видимо режим I- не включился, иначе дельфа не должна ничего выводить
---------
FAQ me off!
Ответ отправил: Romodos (статус: 6-ой класс)
Отправлен: 12.09.2005, 07:05

Отвечает: Denis Hakimov
Здравствуйте, Teapot!
Вообщето все правильно у вас написано. Возможно это проблема связана с вашей версией Delphi.

Приложение:

Ответ отправил: Denis Hakimov (статус: 2-ой класс)
Отправлен: 12.09.2005, 07:31

Отвечает: Jadd
Здравствуйте, Teapot!
Есть WinAPI функция GetLastError. Она содержит ошибки процесса. Попробуй ей воспользоваться.
---------
Если в сердце дверь закрыта, нужно в печень постучаться
Ответ отправил: Jadd (статус: Практикант)
Отправлен: 12.09.2005, 12:09

Отвечает: Маренич Владимир
Здравствуйте, Teapot!

Ваш код в Delphi 7 работает нормально. Вы не указали, какая у Вас версия.
Я обычно пользуюсь конструкцией TRY EXCEPT.

Приложение:

Ответ отправил: Маренич Владимир (статус: 2-ой класс)
Отправлен: 12.09.2005, 12:49

Отвечает: VBA
Здравствуйте, Teapot!

Try
AssignFile(F,FName);
Reset(F);
Except
On E:EIOError do
Begin
ShowMessage(IntToStr(E.ErrorCode));
End;
End;
---------
Неправ вечно юзер, ибо прав всегда Админ!
Ответ отправил: VBA (статус: 6-ой класс)
Отправлен: 12.09.2005, 13:39

Отвечает: Denisss
Здравствуйте, Teapot!
А зачем, собственно, получать ошибку, чтобы понять существует файл или нет?

if not FileExists(fName) then
begin
Edit1.Text:= Format('Файл "%s" не существует!', [fName]);
Exit;
end;
....
Ответ отправил: Denisss (статус: Практикант)
Отправлен: 12.09.2005, 18:07


Вопрос № 26.146
Нет ли у StringGrid какого нибудь метода, чтобы разом очистить все ячейки???

И как выровнять содержимое в ячейке по центру по вертикали и по горизонтали????

Как можно сделать чтобы в куче однотипных объектов к ним можно было обращаться по индексу, ну чтоб в циклы засовывать и т. д. Т.е. например есть 30 шейпов и надо обратиться к ним так - Шейп[i].
Слышал что-то про ObjectList или ComponentList вроде того...
Спасибо за предыдущие ответы.
Отправлен: 10.09.2005, 21:34
Вопрос задал: ququ1 (статус: Посетитель)
Всего ответов: 4
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: sir henry
Здравствуйте, ququ1!
1. Такого метода, чтобы очищал всю таблицу нет. Надо делать в цикле проход по столбцам или по строкам (которые имеют тип TStrings) и использовать метод TStringGrid.Rows.Clear. Правда сам я это не испытывал и как будет работать не знаю. Аналогичный результат - прохождение в цикле по всем ячейкам:
For i:=0 To ColCount-1 do
For j:=0 To RowCount-1 do
TStringGrid.Cells[i, j]:='';
2. Кучу однотипных объектов удобно создавать в виде массива и, соответственно, обращатся к ним по индексу:
Var
lbl: array[0..20] of TLable;
i:=Integer;
Begin
For i:=0 to 20 do
Begin
lbl[i].Create(Form1);
Lbl[i].Top:=i*10;
lbl[i].Left:=30;
lbl[i].Caption:='Lable '+IntToStr(i);
End;
End;
Другой способ, если у Вас на форме (например) одни сплошные шейпы, то так:
var
i: Integer;
Begin
For i:=0 To ControlCount-1 do
Controls[i].Свойство:=Значение;
End;
Ответ отправил: sir henry (статус: Профессор)
Отправлен: 12.09.2005, 06:25

Отвечает: Romodos
Здравствуйте, ququ1!
1) нет, но это можно сделать так:
for i:=0 to stringgrid1.rowcount do
stringgrid1.Rows[i].Clear;
2)не знаю
3)
Например завести массив из 30 шейпов и обращаться как с элементами массива
var b:array[1..30] of tshape;
i:integer;
begin
for i:=1 to 30 do begin
b[i]:=TShape.Create(form1);
b[i].Parent:=form1;
b[i].height:=10;
b[i].width:=10;
b[i].top:=10;
b[i].left:=i*10-10;
end;
end;
---------
FAQ me off!
Ответ отправил: Romodos (статус: 6-ой класс)
Отправлен: 12.09.2005, 07:05

Отвечает: Ерёмин Андрей
Здравствуйте, ququ1!
Первое, что приходит в голову:

StringGrid1.Cols.Clear;
StringGrid1.Rows.Clear;


Стандартный TStringGrid не позволяет изменять выравнивание текста. Это можно делать вручную, самому отрисовывая ячейки через событие OnDrawCell. Но есть компоненты, где эта функция предусмотрена - AdvStringGrid и XStringGrid например.
---------
Мышка побежала, xвостиком махнула - cервер упал...
Ответ отправил: Ерёмин Андрей (статус: Практикант)
Отправлен: 12.09.2005, 08:43

Отвечает: Маренич Владимир
Здравствуйте, ququ1!
По первосу вопросу:
//Быстро и без боли:)
SaveRowCount:=StringGrid1.RowCount;
StringGrid1.RowCount:=0;
StringGrid1.RowCount:=SaveRowCount;
//Если У Вас в гриде есть "шапка", то тогда вместо
//StringGrid1.RowCount:=0 написать 1.

По второму вопросу:
Такого в стандартном TStringGrid нет. Нужно искать другой компонент (например на www.torry.net - там их куча, выбирай на свой вкус) или прорисовывать в обработчике OnDrawCell и прорисовывать текст по своему усмотрению (выравнивание, шрифт, цвет, картинки и т.д.)...

По третьему вопросу:
Создайте объект TObjectList (модуль Contnrs):
Если создаете объекты в Run time, то
TForm1 = class(TForm)
//....
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
MyShapes: TObjectList;
end;

//...

procedure Form1.FormCreate(Sender: TObject);
var
P: TShape;
i: integer;
begin
//Если true, то при уничтожении списка (или удалении из списка)
//будут уничтожаться и объекты, которые в нём хранятся
MyShapes := TObjectList.Create(false);
//Создаем объекты
for i:=1 to 100 do
begin
P:=TShape.Create(Form1);
P.Parent:=Form1;
P.Width:=5;
P.Align:=alLeft;
MyShapes.Add(P);
end;
//Работаем с объектами
for i:=0 to MyShapes.Count-1 do
(MyShapes[i] as TShape).Shape:=stEllipse;
end;

procedure Form1.FormDestroy(Sender: TObject);
begin
MyShapes.Free;
end;
Ответ отправил: Маренич Владимир (статус: 2-ой класс)
Отправлен: 12.09.2005, 13:22


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2005, RusFAQ.ru, Россия, Москва. Все права защищены.
Идея, дизайн, программирование, авторское право: Калашников О.А.

Яндекс


Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.delphiplus
Отписаться
Вспомнить пароль

В избранное