Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (версии 2009, 2010 Weaver, 2011 Fulcrum)

Автор: TechnoDreamer
Дата сообщения: 26.12.2010 22:09
Есть модальная форма. Необходимо ее закрывать если юзер кликнул за ее пределами. Как?
Автор: ZBEP
Дата сообщения: 27.12.2010 00:47
Вобщем сделал я серверную часть, на днях менюшку сделаю для сетевого режима + привяжу принимаемые команды к действиям противника в игре.
И можно уже будет поиграть против кого-нибудь

Хотя пока только 88 боевых карт без дополнительных способностей.
Позже буду задавать способности + добавлять магческие карты.

Подскажите, если знаете, как мне из строки "GAME 1 HodKart 12 6 5" скопировать цифры "12", "6", "5" ?

Делаю так, но мне этот способ совершенно не нравится:
Биру строку и побуквенно проверяю на пробелы..


Код: CMDKART[0]:='GAME 1 HodKart 3 6 5';
Kp:=0; //integer
for i2:=15 to Length(CMDKART[0]) do
begin
if(Kp=1)and(CMDKART[0][i2]<>' ')then CMDKART[1]:=CMDKART[1]+CMDKART[0][i2]; //String
if(Kp=2)and(CMDKART[0][i2]<>' ')then CMDKART[2]:=CMDKART[2]+CMDKART[0][i2]; //String
if(Kp=3)and(CMDKART[0][i2]<>' ')then CMDKART[3]:=CMDKART[3]+CMDKART[0][i2]; //String
if(Kp=4)or(i2=Length(CMDKART[0]))then
begin
//Присваиваю переменным полученные значения
end;
if(i2<=Length(CMDKART[0]))then
if(CMDKART[0][i2]=' ')then Kp:=Kp+1;
end;
Автор: Frodo_Torbins
Дата сообщения: 27.12.2010 08:38
TechnoDreamer
Можно хук на мышку повесить.

ZBEP
По той статье книга написана, а к книге компакт диск с примерами прилагается. Я бы вам рекомендовал все же взглянуть на них.
Что касается вашего кода, то стоит выделить код, вырезающий подстроку от текущей позиции до следующего пробела, в отдельную функцию.
Автор: mdid
Дата сообщения: 27.12.2010 09:49
народ посоветуйте адекватный компонент работы с xml...ибо парсить или юзать импортированный ms xml уж оч не хочется
Автор: tanaseduard
Дата сообщения: 27.12.2010 09:52
mdid

Юзай TNativeXML.
Лучше и быстрее не нашел.
Автор: mdid
Дата сообщения: 27.12.2010 10:01
пасиб..попробую
Автор: 0D0A
Дата сообщения: 27.12.2010 13:44
TechnoDreamer
Если "пределы" это парент модальной формы, то обрабатывай его WM_SETCURSOR. Иначе через хук.
Автор: ZBEP
Дата сообщения: 27.12.2010 16:23
Frodo_Torbins

Цитата:
По той статье книга написана, а к книге компакт диск с примерами прилагается. Я бы вам рекомендовал все же взглянуть на них.
Что касается вашего кода, то стоит выделить код, вырезающий подстроку от текущей позиции до следующего пробела, в отдельную функцию.

Я прочел (не все, про TCP только), после этого решил перейти на IRC.
Как время будет прочту все Пока IRC для меня наилучшее решение, т.к. с клиентом я относительно долго работал, а в сервере ничего сложного нет, да и стабильно вроде пока работает.

Кинул в отдельную функцию, только что это меняет? Сам способ корявый.
Проще тогда отправлять каждый параметр в отдельной строке, и копировать с 15 символа до конца строки, но это тоже коряво да и сообщение увеличится в 3 раза.

П.с.
Еще одна не очень приятная вещь, при получении параметров по куску кода который я выкладывал выше (копирование из строки значений), параметры задаются сразу, как и должно быть, но если сразу после "задания" параметров - загружать текстуру (исходя из принятых данных), то игра виснет XD Но если подождать перед загрузкой 10 мс. то все отлично работает.
Автор: Frodo_Torbins
Дата сообщения: 27.12.2010 18:47
ZBEP
Цитата:
Кинул в отдельную функцию, только что это меняет? Сам способ корявый.
Проще тогда отправлять каждый параметр в отдельной строке, и копировать с 15 символа до конца строки, но это тоже коряво да и сообщение увеличится в 3 раза.
Можно передавать числа в бинарном виде, правда не с помощью IRC.
По поводу задержек - хз, приведенная вами часть кода такого эффекта давать не должна.
Автор: ZBEP
Дата сообщения: 27.12.2010 20:48
Frodo_Torbins, а что мешает через IRC в бинарном виде передавать? И зачем?
Ну это пока не особо важно, а вот что с загрузками текстур не пойму, к примеру если перед загрузкой текстуры ожидаю 10 мс иногда виснет (хз отчего зависит, бывает на 3 загрузке, бывает на 1).
А если кидаю на таймер с интервалом в 10 и включаю его как получу нужные значения и после загрузки текстур - отключаю, то все стабильно и без зависаний, как и должно быть.
Как то странно..

П.с.
С таймеров вообще не виснет вне зависимости от интервала.

Вот еще без таймера если, то выдало такое вот:

Но с какого перепугу???
Все заданно, все нужные переменные получены, место для текстуры создано..

хз инди ли в этом виновата или делфи..

Вот например код по нажатию на мемо - грузить тексуру:

Код: procedure TForm1.Memo1Click(Sender: TObject);
begin
DXLoadTextureFromFile('Data/Karts/1.png',Bus,0);
end;
Автор: Frodo_Torbins
Дата сообщения: 27.12.2010 22:34
ZBEP
Похоже что то не то с синхронизацией потоков. Внимательно проследите в каком потоке какая часть вашего кода выполняется.
Цитата:
а что мешает через IRC в бинарном виде передавать? И зачем?
IRC - это стандартизированный протокол, и компоненты могут без вашего ведома вырезать из сообщений символы к примеру с кодами ниже 32. А полезен бинарный режим потому, что для чисел от 0 до 255 вы можете передавать по одному байту, при этом вообще не парясь с парсингом строк.
Что то мне подсказывает, что в инди должна быть возможность совместить кастомный бинарный протокол с IRC в одном потоке. По крайней мере компрессию они как то делают.
Автор: ZBEP
Дата сообщения: 27.12.2010 23:20
Frodo_Torbins, спс, понятно, не знал.
А насчет этого:

Цитата:
Вот например код по нажатию на мемо - грузить тексуру:

Код: procedure TForm1.Memo1Click(Sender: TObject);
begin
DXLoadTextureFromFile('Data/Karts/1.png',Bus,0);
end;

Грузит все удачно без проблем.

А вот пример загрузки текстуры, если от idIRCServer пришла команда "DellKart"

Код: procedure TForm1.IdIRC1DellKart(ASender: TIdCommand);
begin
DXLoadTextureFromFile('Data/Karts/1.png',Bus,0);
end;
Автор: Frodo_Torbins
Дата сообщения: 27.12.2010 23:43
ZBEP
Вполне возможно IdIRC1DellKart вызывается в отдельном потоке, в новых версиях иде это должно быть видно. Попробуйте вызывать DXLoadTextureFromFile('Data/Karts/1.png',Bus,0); в ответ на кастомное сообщение, к примеру WM_User+1. А из IdIRC1DellKart соответственно отправлять это сообщение самому себе.
Автор: ZBEP
Дата сообщения: 28.12.2010 00:00
Frodo_Torbins, вроде нашел в чем проблема, но не совсем разобрался, позже напишу подробнее, в чем дело было.
(В функции загрузки изображения)

п.с.
Блин, чет не выходит ничего, как бы не выводил - все равно иногда виснет, хоть и реже..
Завтра буду пробовать обойти это..

Можно вообще сделать по другому, но это дольше и больше нагрузки.
Заносить все в логи, а потом по таймеру, построчно искать в логах нужную строку, затем в этой строке побуквенно искать нужные значения..
Но хотелось бы без этого обойтись, т.к. если бы не зависания, то было бы очень удобно, сразу принимать нужные команды без лишних манипуляций с логами.

Если у кого-нибудь есть желание, то могу залить простейший пример клиент-сервера с выводом изображения через DX по принятию команды от сервера, может это я криворукий.

Frodo_Torbins,
Цитата:
Попробуйте вызывать DXLoadTextureFromFile('Data/Karts/1.png',Bus,0); в ответ на кастомное сообщение

При принятии любых сообщений idIRC -ом текстуры загружаются через раз и когда не загружаются, прога намертво виснет и иногда жалуется на память.

Если создать отдельную процедуру загрузки текстуры и вызвать ее в IdIRC1DellKart, с ожиданиями или сразу, то все равно текстуры иногда не загружаются и прога намертво виснет.

П.п.с.
Не знаю как у Вас у всех, но у меня при использовании INDY постоянные проблемы XD
Правда все что были ранее успешно решены, а с этим я хз что делать..
Скорее надо LoadTextureFromFile ковырять чем INDY, но DXLoadTextureFromFile я уже ковырял и это мало чем помогло

А если сделать так:

Код: procedure TForm1.IdIRC1DellKart(ASender: TIdCommand);
begin
IdIRC1.CommandHandlers.Items[1].Enabled:=false; //Это команда DellKart, типа обрабатывать ее или нет.
DXLoadTextureFromFile('Data/Karts/1.png',Bus,0);
IdIRC1.CommandHandlers.Items[1].Enabled:=true;
end;
Автор: delover
Дата сообщения: 29.12.2010 10:57
ZBEP
Судя по тому что написано дело именно в потоках. Стандартом VCL является то что вы не можете использовать Visual Component Library из потоков. Зная немного IdXXX реальнее предположить что вы не в главном потоке это делаете. Рекоммендация одна и та же как написал Frodo_Torbins. Получив по IdXXX вы посылаете себе сообщение. Попробую изобразить код что надо:

Код: TForm1 = class(TForm)
...
private
procedure WM_User_1(var Message: TMessage); message WM_User+1;
...

procedure TForm1.IdIRC1DellKart(ASender: TIdCommand);
begin
PostMessage(Handle, WM_User+1, 0, 0)
end;

procedure TForm1.WM_User_1(var Message: TMessage);
begin
Memo1Click(Self.Memo1);
end;
Автор: ZBEP
Дата сообщения: 29.12.2010 19:41
delover, я видимо не правильно понял по началу.

А как мне передать полученное значение в WM_User_1?
Ну т.е.

Код: procedure TForm1.IdIRC1DellKart(ASender: TIdCommand);
var KDell:string;
begin
KDell:=ASender.RawLine[12]; //Как KDell передать, не объявляя ее глобально?
PostMessage(Handle, WM_User+1, 0, 0)
end;

procedure TForm1.WM_User_1(var Message: TMessage);
begin
DXLoadTextureFromFile('Data/Karts/'+KDell+'.png',Bus,0); //Что бы загрузило текстуру по полученному номеру.
end;
Автор: Frodo_Torbins
Дата сообщения: 29.12.2010 20:45
ZBEP
У PostMessage целых два параметра для передачи данных. В первый можно запихнуть ссылку на область памяти, а во второй ее размер. Этого вполне достаточно чтобы в WM_User_1 освободить память выделенную в IdIRC1DellKart. Получить эти два параметра можно из Message.WParam и Message.LParam. Поэкспериментируйте, там все довольно просто.
Автор: ZBEP
Дата сообщения: 29.12.2010 23:59
Frodo_Torbins, ок спасибо, как время будет сделаю)
Автор: delover
Дата сообщения: 30.12.2010 09:16
Frodo_Torbins
Тут он посылает значение самому себе и не очень удачный выбор передавать параметры. Лучше сохранить типа
событие
form1.MyParam1 := StringТочтояхочу;
А потом читать его прямо без всякого винапи.

Добавлено:
ZBEP
var KDell:string;
Это надо объявить в теле формы то есть
TForm1 = class()
public
KDell:string;
end;
Тогда эта переменная будет видна и там и там.
Автор: Kr_Alex
Дата сообщения: 30.12.2010 09:34
Помогите пожалуйста.
Как в стандартный TImage загрузить картинку tiff?
Автор: ZBEP
Дата сообщения: 30.12.2010 18:46
delover, спс, так наверное и сделаю, не хотел по началу так делать, там и так много слишком всего объявлено, думал можно примерно также, как с процедурами/функциями передавать им значения переменных, без объявления их в теле формы.
Жалко нельзя в той же процедуре загружать текстуру, в которой пулучил данные от сервера, а то много лишнего, но нужного получается.

Офф:
Сделал динамическое изменение статов для каждой из карт (ну точнее для карт уже было, но тогда при изменении параметров, к примеру Карты №5 значения менялись у всех Карт №5 на поле. Теперь параметры меняются только у той карты, у которой они были изменены) + там с параметрами героев кое что сделал.
Осталось через серв учитывать все нужные значения и уже будет полная синхронизация клиентов во время игры.
Останется только дорабатывать, т.е. вводить способности для карт (сейчас они дез способностей. только бьются), добавлять новые карты (сейчас их 88).
Ну и менюшки всякие для удобства рисовать.
Магию героев буду делать только после доделывания боевой системы карт/магических карт/способностей карт.
Вобще идей очень много и вроде, знаю как это все сделать (ну если конечно опять не вылезит что-то вроде того, как с загрузкой текстур в процедуре приема сообщений).
Времени только не хватает
Автор: Frodo_Torbins
Дата сообщения: 31.12.2010 16:17
Kr_Alex
Обычно достаточно добавить в uses модуль реализующий поддержку нужного формата. Искать такой модуль можно например тут: http://www.torry.net/pages.php?id=112
Автор: ZBEP
Дата сообщения: 01.01.2011 21:01
Подскажите, как добавить свое событие в TTimer, что бы было к примеру так:
procedure Timer3Timer(Sender: TObject;N1,N2:integer);

Или может легче создать компонент, наследника TTimer ?

П.с.
Знаю, что в гугле это есть, но я сейчас на неделю уезжаю почти в деревню без инета и т.д.
Буду там пока менюшки рисовать да серверную часть встрою в саму игру и анимацию доработаю.

По идее, если изменить событие, а не добавить, будет что-то вроде этого: ExtCtrls.pas

Код: ...
protected
procedure DoOnAnimate(Sender: TObject; N1,N2:integer); virtual;

...
procedure TCustomTrayIcon.DoOnAnimate(Sender: TObject; N1,N2:integer);
begin
if Assigned(FOnAnimate) then
FOnAnimate(Self);
if Assigned(FIconList) and (FIconIndex < FIconList.Count - 1) then
IconIndex := FIconIndex + 1
else
IconIndex := 0;
Refresh;
end;

...
FTimer.OnTimer := DoOnAnimate;
...
Автор: Frodo_Torbins
Дата сообщения: 02.01.2011 10:45
ZBEP
А откуда таймеру знать какие значение должны быть у N1 и N2? У него должны быть как минимум дополнительные поля, или событие.
Если беретесь редактировать стандартный компонент, то копируйте его код в отдельный MyExtCtrls.pas, с редактированием стандартных модулей могут возникнуть разные нехорошие проблемы. Или же воспользуйтесь Шаманским методом Geo.
Автор: Samotek
Дата сообщения: 02.01.2011 14:02
Вопрос по интерфейсу IDE. В 2007 я панель с компонентами докил в окошко с Project Manager. Это что отменили или можно это настроить?
Автор: zerofer
Дата сообщения: 03.01.2011 02:21
дайте пример авторизации на сайте https с сертификатом
Автор: MrZeRo
Дата сообщения: 04.01.2011 15:16
zerofer
хттп://www.delphisources.ru/pages/faq/images-indy/indy-in-depth-19.html

В примерах, которые идут с INDY, тоже, кажется, есть пример работы с сертификатами.
Автор: unikum
Дата сообщения: 05.01.2011 17:44
Планирую переделать свою прогу, написанную на D10. Но хоцца ее сделать мультиплатформенной, как минимум Win+Mac. В добавок, есть подозрение, что на Win7 64 бита иногда падает из-за несовместимости указателей (там вешается хук). И вот у меня выбор "куда бежать".
XE хоть и обещают выпустить 64-разрядную весной, но как мы знаем, обещанного, да и еще нормально работающего, три года ждут

1. Для Win 64-бит попробую переползти на Лазарус. Но как вариант есть желание попробовать Delphi PRISM.

2. Для Мака можно тоже Лазарус, но обчитался кучу отзывов что Apple очень негативно относится к программам написанным не на XCode и зачастую не пропускает в свой AppStore. Посему связка XCode+FreePascal более предпочтительна но о ней слышал только в теории.

У кого был подобный опыт перевода проекта на друю ос, какие IDE использовали и на какие подводные камни стоит в первую очередь обращать внимание.

ЗЫ. Понимаю, что мультиплатформенным смогу делать только код. Интерфейс придется рисовать свой на каждую платформу.

ЗЫЫ. Особо-спецальных компонентов практически не использую, по крайней мере можно поискать и замену, ну разве что с БД прийдется немного помудрить.

Автор: Frodo_Torbins
Дата сообщения: 06.01.2011 11:03
unikum
В ветке по Delphi XE были бетки, в которых присутствовала компиляция под мак. Потом ее правда убрали, т к не успевали доделать к дате релиза, а выпускать еще один D2005 не захотели. Тем не менее представление о том, что мы получим в следующем релизе можно получить достаточно полное. И кстати ИДЕ для мака вообще не планируется, что как бы намекает
Автор: aidarsimon
Дата сообщения: 06.01.2011 21:02
Здравствуйте. Можно ли сделать такую прогу, чтоб там были два едита (логин и пасс). При заполнении значений в них инфа отсылалась на сайт в форму ввода и логинилось бы на нем. Как будут обстоять дела в этом случае с кукисами и в какую сторону вообще копать?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

Предыдущая тема: Установка копоненты ZipTV


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.