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

» Вопросы по Delphi (до версии 2009) - часть 5

Автор: V1s1ter
Дата сообщения: 12.11.2009 13:37
Kursist
В дополнение к akaGM
Перед заданием ввода имени еще не забудь Str := '';
Автор: Kursist
Дата сообщения: 12.11.2009 13:43
//------------------INSERT GAMER NAME----------------------------------------------
procedure TFrmMain36.FormKeyPress(Sender: TObject; var Key: Char);
var
S:Char;
loop:Integer;
begin
Str:='';
if EditNameMode then
begin
if (Key>='A') and (Key<='z') then
Str:=Str+Key;
end;
if Str<>'' then
begin
GamerNameString.Clear;
GamerNameString.Add(Str);
GamerNameString.SaveToFile('resorces/gamerName.txt');
apStrings.Strings.Strings[13]:='Name: '+GamerNameString.Strings[0];
end;
end;

Не работает. (слово по-умолчанию "Gamer" не меняется)

for loop := 0 to 8 do
Str[loop]:=Key;
Выводит 8 одинаковых символов

Добавлено:

Цитата:
GamerNameString.Clear;
GamerNameString.Add(Str);
GamerNameString.SaveToFile('resorces/gamerName.txt');
apStrings.Strings.Strings[13]:='Name: '+GamerNameString.Strings[0];



GamerNameString - TStringList
apStrings.Strings - TStringList (часть собственного класса выводящего символы методом ОпенГЛ)

Добавлено:

Цитата:
Str:=Str[loop]+Key; -- тоже неверно
внутри обработчика вместо цикла просто поставь
Str := Str + Key;


Мне надо оградить объем вводимых символов восемью знаками. Думал через цикл, попробовал через рекурсию - в цикле вызывать метод FormKeyPress(self, Key) - заругалась Дельфи

Добавлено:
Str:string[8]; - сделал глобальной

Str:='';
if EditNameMode then
begin
if Ord(Key)>64 then
Str:=Str+Key;
end;

Всё-равно выводит только один символ.

Добавлено:
Разобрался ))


Цитата:
Перед заданием ввода имени еще не забудь Str := '';


Это была шутка? Из-за этого у меня один символ и показывался
Автор: V1s1ter
Дата сообщения: 12.11.2009 14:23
Kursist

Цитата:
Не работает. (слово по-умолчанию "Gamer" не меняется)

И не будет. Объясняю на пальцах:
Gamer жмет "G"
Вызывается FormKeyPress(..., а в ней Str:=''; Str:=Str+Key; тоесть в итоге Str="G"
Gamer жмет "a"
Вызывается FormKeyPress(..., а в ней Str:=''; Str:=Str+Key; тоесть в итоге Str="a"
Gamer жмет "m"
Вызывается FormKeyPress(..., а в ней Str:=''; Str:=Str+Key; тоесть в итоге Str="m"
.
.
Ясно что в общем итоге имя будет равно последнему символу.
А Вы попробуйте Str:='' вынести из процедуры FormKeyPress
Автор: akaGM
Дата сообщения: 12.11.2009 14:29
Kursist

Цитата:
Это была шутка?

это есть основы программирования

V1s1ter
я тоже сначала не врубился, он там в своём письме нам отвечает...
зациклился
гы
Автор: V1s1ter
Дата сообщения: 12.11.2009 14:40
Kursist
В догонку.
Вообще код

Цитата:
GamerNameString.Clear;
GamerNameString.Add(Str);
GamerNameString.SaveToFile('resorces/gamerName.txt');
apStrings.Strings.Strings[13]:='Name: '+GamerNameString.Strings[0];

тоже надо бы вынести за рамки FormKeyPress
Я бы делал так
1) GamerName := '';
2) Рисуем окно
3) while EditNameMode do ;
4) Схраняем GamerName в файле и прочее
В самой FormKeyPress

Код:
procedure TFrmMain36.FormKeyPress(Sender: TObject; var Key: Char);
begin
EditNameMode := (Key <> VK_TAB) and (Key <> VK_ENTER);
if EditNameMode then begin
if (Key>='A') and (Key<='z') then GamerName:=GamerName+Key;
EditNameMode := Length(GamerName) < 8;
Здесь только рисуем имя GLTextOut(X, Y, GamerName);
end;
end;
Автор: Kursist
Дата сообщения: 12.11.2009 14:41
V1s1ter

akaGM

Цитата:
это есть основы программирования

V1s1ter
я тоже сначала не врубился, он там в своём письме нам отвечает...
зациклился
гы



Извините, автоматически мои сообщения добавлялись к предыдущему сообщению.
V1s1ter
Str:=''; - ввёл в другой более ранней процедуре (в момент вызова режима ввода)


Цитата:
Ясно что в общем итоге имя будет равно последнему символу.
А Вы попробуйте Str:='' вынести из процедуры FormKeyPress


Спасибо, извиняюсь ещё раз! Уже всё сделал. Всё заработало.

Добавлено:
Да, не хорошо, что каждый раз по нажатию клавиши будет в файл сохраняться.
Сделал так:

//----------------SCENE 00 CLICK-----------------------------------------------------
procedure Click_00(aX,aY:Integer);
begin

{userName}
if GUIList.Items(0).MouseClick(13,aX,aY) then
begin
EditNameMode:=NOT EditNameMode;
apStrings.Items(13).Info.Color:=clRed;
apStrings.Strings.Strings[13]:='Name: '+GamerNameString.Strings[0];

if EditNameMode then StrGamerName:='';
if EditNameMode=FALSE then
if StrGamerName<>'' then
GamerNameString.SaveToFile('resorces/gn');
end;
end;

//------------------INSERT GAMER NAME----------------------------------------------
procedure TFrmMain36.FormKeyPress(Sender: TObject; var Key: Char);
begin
if EditNameMode then
begin
if (Ord(Key)>45) then
StrGamerName:=StrGamerName+Key;
end;
if StrGamerName<>'' then
begin
GamerNameString.Clear;
GamerNameString.Add(StrGamerName);
apStrings.Strings.Strings[13]:='Name: '+GamerNameString.Strings[0];
end;
end;
Автор: emo
Дата сообщения: 13.11.2009 08:59
Господа.
У меня возникла проблема при использовании удаленной отладки (remote debugging) с Д2007 и Windows 7. Когда удаленый процесс запускается на Windows 7, то дельфи виснет и помогает только убийство процесса.
Есть тут кто, кто использовал удаленную отладку на Windows 7 с Д2007?
Автор: mdid
Дата сообщения: 19.11.2009 15:14
может кто знает как получить список всех видимых форм своей программы?
Автор: data man
Дата сообщения: 19.11.2009 15:39
mdid


Код: For I := 0 to Screen.FormCount - 1 do
if Screen.Forms[I].Visible then ...
Автор: mdid
Дата сообщения: 19.11.2009 15:48
о..отлично..пасиб..я в этом направлени и не копал
Автор: maix
Дата сообщения: 20.11.2009 07:46
Вот подскажите плиз такой вопросец есть. Когда компилируешь встроенным компилером exe-шник, то если его потом открыть например блокнотом то в конце файла видно:
name="CodeGear ..."
version="1.0.0.0"
или
name="DelphiApplication"
    version="1.0.0.0"
Можно это как то убрать или изменить?
Может надо бругой упаковщик использовать? я только начинаю с этим всем разбираться и вот очень интересен такой вопрос.
ЗЫ: гугл ответа не дал
Автор: Eyrikh
Дата сообщения: 20.11.2009 07:54
maix

Цитата:
Можно это как то убрать или изменить?


Посмотри меню
Project->Options...->Version Info
Автор: maix
Дата сообщения: 20.11.2009 08:48

Цитата:
Посмотри меню
Project->Options...->Version Info

Это я так понял дает показ версии в свойствах exe. а не при просмотре его блокнотом
Автор: data man
Дата сообщения: 20.11.2009 09:13
maix

Цитата:
name="CodeGear ..."
    version="1.0.0.0"

Ты привел кусочек из manifest'а.

Цитата:
Можно это как то убрать или изменить?

А это чем-то мешает ?
И советую почитать что такое windows manifest и для чего он нужен, прежде чем менять exe блокнотом.
Автор: maix
Дата сообщения: 20.11.2009 10:23
Спасибо за наводку. А вот можете подсказать какой-нибудь нормальный компилер для delphi чтобы размер приложений был меньше чем со встроенным. Желательно со ссылками и как их туда установить
Автор: greenpc
Дата сообщения: 20.11.2009 10:41
maix
дело не в компиляторе, а в простоте написания программы (uses by def.)
хочешь уменьшить размер пиши через апи или как вариант посмотри на KOL
Автор: data man
Дата сообщения: 20.11.2009 10:43
maix
Что значит "встроенный" и "нормальный" компилер ? "Внешнего" для Delphi нет и не будет.
Компиляция производится либо из среды, либо в командной строке вызовом dcc32.exe, но по сути используется один и тот компилятор.
Спрошу так:
1. Какая версия Delphi ?
2. Какой размер приложения получается и чем он не устраивает ?
Автор: psa1974
Дата сообщения: 20.11.2009 10:45
maix
Размер зависит в большей степени от используемых библиотек чем от версии компилятора. Если в Дельфи писать без использования VCL на чистом API - размер будет до безобразия копеечным. А если использовать еще и сторонние библиотеки компонентов, скажем DevExpress со скинами, размер железно разбухает на 5-10 мегабайт, как минимум.

Добавлено:
И совершенно верно говорит data man, что альтернативы дельфийскому компилятору для компиляции в Дельфи нет. Есть только альтернатива в используемой версии самой Дельфи - скажем, в Дельфи 7 результат компиляции будет меньше по объему, чем в Дельфи 2010...
Автор: maix
Дата сообщения: 20.11.2009 13:13
1. 2010
2. если совсем простое пишешь то размер 800к, Если после этого ее сжать сторонней сжималкой то размер падает до 200-300к. (Может я чтото в определениях попутал, Сжать и откомппилить. Ламер я пока еще в этом всем)
Что есть KOL ?
Автор: psa1974
Дата сообщения: 20.11.2009 13:29
maix

Цитата:
2010

Так и есть - 800 Кб - нормальный размер для этой версии Дельфи. В 7 Дельфи пустой проект весит порядка 300 Кб. Все дело в том что даже если приложение состоит из одной формы и ничего не делает, все равно подключается VCL.

KOL - альтернатива VCL, бесплатная библиотека, позволяющая разрабатывать на Delphi компактные программы. Взять можно здесь: http://kolmck.net Но все равно получаемый экзешник в 2010 Дельфи будет больше чем в предыдущих версиях Дельфи из-за нововведений в RTTI.
Автор: data man
Дата сообщения: 20.11.2009 13:32
maix
Есть Вопросы по Delphi 2010 (Weaver)
Там в шапке (да и топик полезно почитать) написано, как уменьшить размер exe-файла, отключив новые RTTI-возможности D2010.
Автор: psa1974
Дата сообщения: 20.11.2009 13:34
Чтобы почувствовать что такое VCL, сделай консольную программу - получишь экзешник размером 100 кб.
А вообще Дельфи 2010 не преследует цель написания программ минимального размера. Она для тех что любит роскошь и комфорт. А хочешь писать минимальные проги - бери Дельфи 3, будешь сильно удевлен малым размером. Вон, например, Total commander дор сих пор на Дельфи 3 пишется...
Автор: mdid
Дата сообщения: 20.11.2009 14:54
создаю в PopupMenu программно submenu которое формируется по onPopUp

Код:
mi:=TMenuItem.Create(self);
mi.Caption:=ds.DataSet.FieldByName('Наименование').AsString;
mi.Tag:=ds.DataSet.FieldByName('ID').AsInteger;
mi.OnClick:=ReplaceItem;
TMenuItem(Sender).Insert(i,mi);
Автор: ShIvADeSt
Дата сообщения: 20.11.2009 15:13
psa1974

Цитата:
Чтобы почувствовать что такое VCL, сделай консольную программу - получишь экзешник размером 100 кб.

Странно, у меня при создании консольного приложения размер не превышает 20 килов. Пишу для версии Дельфи 5, но не думаю в 2010 умудрились в базовые модули засунуть столько мусора.
Автор: psa1974
Дата сообщения: 20.11.2009 15:19
mdid
onClick надо назначать не самому субменю, а пунктам этого субменю, а их в своем примере вообще не создаешь. В итоге твое субменю ведет себя как обычный пункт меню.

Добавлено:
ShIvADeSt

Цитата:
у меня при создании консольного приложения размер не превышает 20 килов

Совершенно согласен! Я когда на Дельфи 7 писал консольное приложение, состоящее из 2 строк: поиска окна диспетчера задач и прибивания его (ну, надо было ), то его размер был ровно 15360 байт. И когда сейчас я писал свой пост, я такую цифру сперва и написал, но потом все-таки решил запустить Дельфи 2010 и проверить... Итог (добайтно): 113664 байт, а поскольку maix вооружился именно Дельфи 2010, то я такую цифру и привел.

Ою этом я и говорю: Дельфи 2010 - не для компактного размера программ. За удобства надо "платить" размером...
Автор: Odysseos
Дата сообщения: 20.11.2009 23:23
maix


Цитата:
А вот можете подсказать какой-нибудь нормальный компилер для delphi чтобы размер приложений был меньше чем со встроенным. Желательно со ссылками и как их туда установить


В нынешние времена гигабайт оперативной памяти и мегабитных сетевых каналов уместен такой вопрос - а зачем, собственно, уменьшать размер приложения с целью сэкономить килобайты?.. Особенно учитывая, что весь современный софт (выполняющий хоть сколько-нибудь серьёзную работу) ворочает данными, превосходящими размер кода во многие тысячи раз.
Автор: SIgor33
Дата сообщения: 21.11.2009 10:47
Есть код
var
s: TSocket;
WSData: WSAData;
Protocol: Integer;
sAddr: sockaddr_in;
buf: array[0..255] of Char;
iRecv: Integer;
begin
if (WSAStartup($0101,WSData)<>0) then Halt(1);
Protocol:=IPPROTO_TCP;
s:=socket(AF_INET,SOCK_STREAM,Protocol);
if (s=INVALID_SOCKET) then Halt(2);
ZeroMemory(@sAddr,sizeof(sAddr));
sAddr.sin_family:=PF_INET;
sAddr.sin_port:=htons(PORT);
sAddr.sin_addr.S_addr:=inet_addr(IP_ADDRESS);
if (connect(s,sAddr,sizeof(sockaddr_in))=SOCKET_ERROR) then
begin
writeln('Error');
closesocket(s);
WSACleanup;
exit;
end;
writeln('Connected');
closesocket(s);
WSACleanup;
end.


подключаемся к удаленному сокету , если он есть все быстро и нормально
если компьютер отсутствует , долго висит ...
необходимо при отсутствии компьютера в сети сразу выводить ERROR
Автор: ppkp
Дата сообщения: 21.11.2009 14:38
Попробуйте

try
connect(s,sAddr,sizeof(sockaddr_in));
except
On EConnectError do begin// тут я не помню точно название
writeln('Error');
closesocket(s);
WSACleanup;
end;
end;
Автор: NOwlar
Дата сообщения: 23.11.2009 12:39
ppkp
connect не поднимает исключений.

SIgor33
К сожалению, очевидного решения для установки таймаута при недоступности удалённого узла нет. Вот тут статейка описывающая нюансы при вызове connect, предлагающая следующее решение: использовать неблокирующие сокеты. В таком случае вызов connect() сразу же вернётся с SOCKET_ERROR, а вызов WSAGetLastError вернёт 'WSAEWOULDBLOCK', а сам процесс подключения будет происходить дальше. Мы можем подождать нужное нам количество времени (timeout) и проверить состояние сокета, вызвав функцию, которая требует подключенного сокета, например 'getpeername()' or 'recv()'. Если вернётся ошибка, а WSAGetLastError вернёт 'WSAENOTCONN', то мы можем смело предположить, что сокет не подключен и закрыть его. Единственный минус этого подхода состоит в том, что даже если подключение происходит быстро, мы узнаем об этом только через timeout времени. Отрицаттельный эффект можно уменьшить, проверяя состояние сокета через малые интервалы времени, и прекратить проверки, когда в сумме пройдёт timeout времени.

Ещё можно использовать какой-нибудь готовый компонент, например TIdTCPClient из набора Indy 10, где есть свойство ConnectTimeout.
Автор: mdid
Дата сообщения: 23.11.2009 12:53
psa1974

Цитата:
mdid
onClick надо назначать не самому субменю, а пунктам этого субменю, а их в своем примере вообще не создаешь. В итоге твое субменю ведет себя как обычный пункт меню.

эмм...а можно по подробней как?
вот полный код то как я делал

Код:
var
ds : TDataSource;
q : TADOQuery;
MI : TMenuItem;
i : Integer;
begin
if folder='-1' then
TPopupMenu(Sender).Items[4].Clear;
ds:=TDataSource.Create(nil);
q:=TADOQuery.Create(nil);
ds.DataSet:=q;
q.Connection:=Form2.ADOConnection1;
q.SQL.Text:='select * from '+GetTableFromId(true,TableID)+' where (Тип=''0'') and (Принадлежит='''+Folder+''')';
q.Open;
ds.DataSet.First;
for I:=0 to ds.DataSet.RecordCount - 1 do begin
mi:=TMenuItem.Create(self);
mi.Caption:=ds.DataSet.FieldByName('Наименование').AsString;
mi.Tag:=ds.DataSet.FieldByName('ID').AsInteger;
selItem.id_DestGr:=ds.DataSet.FieldByName('ID').AsInteger;
mi.OnClick:=ReplaceItem;
if folder='-1' then
TPopupMenu(Sender).Items[4].Insert(i,mi)
else
TMenuItem(Sender).Insert(i,mi);
CreateListFolder(mi,inttostr(mi.Tag));
ds.DataSet.Next;
end;
ds.Destroy;
q.Destroy;

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Clipper 5


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