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

» Вопрос начинаюшего

Автор: Lss
Дата сообщения: 01.03.2005 18:36
Народ подскажите на примере как пишится процедура которая отвечает за нажатые кнопки на клавиатуре. Например для создания калькулятора штоб можно было не тока по форме тыкать но и кнопки нажимать и это бы писалось в какомнить то Лабел1 или Эдит1.
Автор: TurboMent
Дата сообщения: 01.03.2005 19:03
В VB:

Private Sub %object%_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case 8 'если нажат Backspace
If Len(Label1.Caption) > 0 Then
Label1.Caption = Mid(Label1.Caption, 1, Len(Label1.Caption) - 1)
End If
Exit Sub
Case 13 'если нажат Enter
Exit Sub
End Select

Label1.Caption = Label1.Caption & KeyCode
End Sub


где %object% - объект имеющий у тебя фокус клавиатуры

это то что ты хотел?
Автор: dneprcomp
Дата сообщения: 01.03.2005 22:03
TurboMent

Цитата:
Label1.Caption = Label1.Caption & KeyCode

A вот это, по моему, не совсем то Lss ведь надо добавить не KeyCode, а его значение.
Lss
Для калькулятора нужно еще добавить проверку на IsNumeric, т.к. ни пробелы, ни буквы не нужны.
If IsNumeric(Chr(KeyCode)) = False And KeyCode <> 8 Then
KeyCode = 0
End If
Но вот точка и запятая, а также другие математические спец знаки разрешены.
Возможно, что лучше все это делать на _KeyPress, т.к. манипулировать KeyAscii удобнее в некоторых случаях.
Автор: TurboMent
Дата сообщения: 01.03.2005 23:39
dneprcomp
я просто забыл
честно слово
Автор: dneprcomp
Дата сообщения: 02.03.2005 01:27
TurboMent
Не верю! Нет, ты не забыл...
Просто описка
Автор: Lss
Дата сообщения: 02.03.2005 19:06
Спасибо. Да наверное штото типо такого я пока не очень в ней разобрался шас более пока важным
вопросом занился, потом если не разберусь повторно че нить уточню.

А шас может кто подскажет в чем проблема я тут уже 2-й день маюсь не понимаю в чом ошибка в роди
все правильно, а не работает хотя когда я написал это процедуру и до момента ее улучшения она работала
а вот после "улучшения" шото не как.

Процедура определяет + или - пред чеслом.
типа я мыслю сделать калькулятор не как Виндовский а потипу можь кто видал калькулятор
Касио рублей за 400-500, который анализирует всю введенную строку и выдает ответ.

---2 =-2, --3=3.


procedure TForm1.Button1Click(Sender: TObject);
Var i:integer;s:string;minus:char;

Procedure Oprznac(p:integer;s1:string;Var w:integer;minus1:char);//Входная позиция курсора,Строка,Выходн.позиц,Знак.
Var mi:integer;
begin
mi:=0;minus1:=' ';
if (s1[p]='+')or(s1[p]='-') then
Begin
While (s1[p]='+')or(s1[p]='-') do
Begin
if s1[p]='-' then
inc(mi);
inc(p);
End;

if mi mod 2 =0 then
minus1:=' '
else
minus1:='-';// Вот если отсюда сделать вывод в Лабел2 то все работает
w:=p; //А из процедуры мнус почемуто не выдоется выдоются либо каракули либо палочка либо не че вобше.
End;
end;

begin

s:=Form1.Edit1.Text;
i:=1;
Oprznac(i,s,i,minus);
Form1.Label1.Caption:=IntToStr(i);
//Form1.Label2.Caption:=minus; Вот тута палочка каккаято выводится когда должен быть минус
end;
Автор: dneprcomp
Дата сообщения: 02.03.2005 21:19
Я этого языка не знаю. Может быть здесь как-то по другому, но обычно передача параметра производится по ссылке или по значению. Если надо получить возвратное значение, то надо передавать по ссылке(ByRef). Может потому и не работает, что minus передан по значению(ByVal)
Автор: woffer
Дата сообщения: 02.03.2005 23:21
dneprcomp


Цитата:
//А из процедуры мнус почемуто не выдоется выдоются либо каракули либо палочка либо не че вобше.


либо, либо, все-таки что то передается. ошибка, походу в логике.


Автор: dneprcomp
Дата сообщения: 02.03.2005 23:33
woffer

Цитата:
все-таки что то передается
Не обязательно. В памяти всегда что-нибудь есть. Может в переменную попадает не относящаяся к программе информация. Это зависит от языка програмирования и условий работы с памятью, т.ч. уверенно не могу сказать. В логике ошибки не заметил. Если я не ошибаюсь, то по логике работы функции minus всегда равен пустой строке или "-".
Lss
А что за палочка то? Может это и есть "-", только в другой кодировке. Какое значение ASCII кода?

Добавлено:
Lss
Кстати, недопонял сколько будет крутится 'While (s1[p]='+')or(s1[p]='-') do'
Автор: TurboMent
Дата сообщения: 02.03.2005 23:48
dneprcomp
наверное пока не встретится + или -

Добавлено:
dneprcomp
Этот язык называется Delphi
Автор: Lss
Дата сообщения: 03.03.2005 00:16
Да действительно похоже на делфи. .
БайРеф БайВал яшь всетаки всеволишь неделю делюфи учу.
Ктати програму можите у ся попробыват че у вас выйдет там тока Едит,Кнопка И лейбл. Можно использовать Контр В, Контрл С так быстрее (Шучу)
Кароче задуманно так там приведена лишь часть програмы там ешо будут проверка на наличие знака * в перввой позиции и другое.
Но вот эта часть которая определяет какой знак будет иметь число не работает.
На примере
-+--50+-25=-50-25
Начиная с позиции 1 если там + или - крутится цикл Вайл пока элемент строки S[i] есть знак + или -
иначе выход определение итогового знака занос етого символа в пременую minus, также выдается последняя позиция курсора
тоесть в нашем случае i после процедуры выдаст 5-я позиция(Позиция выдается без ошибок)

Насчет че за знак вертикальная палочка кагда эта част была в основной програме, кагда я ее вынес в отдельную
выводится "d"
Автор: dneprcomp
Дата сообщения: 03.03.2005 01:06
TurboMent

Цитата:
Этот язык называется Delphi

Я так и думал

Цитата:
наверное пока не встретится + или -

Пока не кончаться + или минус. По логике вроде так, но меня синтаксис смутил. И до сих пор смущает. Но опять-таки не знаком с синтаксисом Delphi.
Lss
Посмотри все же в хелпе Delphi передачу параметров by reference. Мне кажется проблема где-то в этой области.
Цитата:
кагда я ее вынес в отдельную
выводится "d"

Может ты используешь переменную minus еще где-нибудь в программе?
Автор: woffer
Дата сообщения: 04.03.2005 02:16
dneprcomp

Цитата:
В памяти всегда что-нибудь есть


Ай, да, это я как-то очень глупо ступил. Сорри (-

А логику и не смотрел. Работу функции в отрыве от остального содержимого смотреть не люблю. (это имхо)

Кстати, не очень хорошо помню синтаксис дельфи, но..


Код:
procedure f(var w:integer; var w2: integer );
Автор: Lss
Дата сообщения: 05.03.2005 13:32
Спасибо. Заработало, походу действительно Вар надо писать перед каждым пораметром, а не перед одним и потом перечеслять.

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

Описание:
Procedure Videlenie(r:integer;p:integer;s1:string;minus1:char;Var w:integer;Var b:{array of} real);
Var zap:integer;a1:string;a2:char;
begin
if (s1[p]='0')or(s1[p]='1')or(s1[p]='2')or(s1[p]='3')or(s1[p]='4')or(s1[p]='5')or(s1[p]='6')or(s1[p]='7')or(s1[p]='8')or(s1[p]='9') then
Begin
zap:=0; a1:=' ';
While (s1[p]='0')or(s1[p]=',')or(s1[p]='1')or(s1[p]='2')or(s1[p]='3')or(s1[p]='4')or(s1[p]='5')or(s1[p]='6')or(s1[p]='7')or(s1[p]='8')or(s1[p]='9') do
Begin
if s1[p]=',' then inc(zap);
if zap>1 then
begin
ShowMessage('&#206;&#248;&#232;&#225;&#238;&#247;&#237;&#224;&#255; &#231;&#224;&#239;&#232;&#241;&#252; &#226; &#231;&#224;&#239;&#255;&#242;&#238;&#233;');
Exit;
end;
a2:=s1[p];
a1:=a1+a2;
inc(p);
End;
b:=StrToFloat(Trim(minus1+Trim(a1)));
// b[r]:=StrToFloat(Trim(minus1+Trim(a1)));
//Form1.Label3.Caption:=FloatToStr(b[r]);//Здесь работает даже при задании масивом но не выводится из процедуры
End;
end;
Вызов:
Videlenie(k,i,s1,minus,i,g);
Form1.Label3.Caption:=FloatToStr(g);

1) Первая проблема в том что если я выходное число b[r]-обявляю масибом какрас то что взято в коментарий в обявлении процедуры
то переменная нормально из процедуры не выходит а пишется число примерно 1,9Е-254(чето такое) разумеется вызывается процедура строкой
Videlenie(k,i,s1,minus,i,а[k]);.
Единственое предположение это то что масив а задан [1..10] а b незадан не как, а при задании тех же размеров не запускается прога
задаю строкой ....; Var b:array[1..10] of real);
При задании выходного значения не масивом а просто числом b то все нармольно выводится
какрас прграмма для этого случая.

Проблема в том что не сразу значение масиву присваевается а мне прийдется потом еше ниже строкой
а[k]:=g; что не есть хорошо. Хотелось бы сразу чтобы все нормально работало без всякого такого изврашения.
2) Вторая проблема не такая важная но всетаки вызывает у меня непонимание устройства и работы
компилятора делфи.
Внизу процедуры есть такие строчки
a2:=s1[p];
a1:=a1+a2;

я думаю понятно сначало в символ а2 выделяется символ из строки s1[p] а затем он добавляется к строке а1
так если в конце а1 это какрас выделяемое число пока ешо в строковом виде.
Вот такая запись не работает хотя ошибки в ней по моему нет
a1:=a1+s1[p];
Почему так не работает?
Автор: dneprcomp
Дата сообщения: 06.03.2005 10:28
Lss

Цитата:
a1:=a1+s1[p];
Почему так не работает

Наверное потому, что пытаешся сложить разные типы данных.
Автор: Lss
Дата сообщения: 06.03.2005 10:54
a1- это строковый тип,
s1[p]- элемент строки тоесть символ. все вроди должно работать.
Ведь когда 2-е строчи с точки зрения сложения типов все тоже самое к строке прибавляется символ.
Автор: Anti_MalpA
Дата сообщения: 06.03.2005 12:24
наша команда сделала патч для игрушки! спомошью чего собрать в месте! и лучше всего чем компелировать???
Автор: TurboMent
Дата сообщения: 06.03.2005 16:12
Anti_MalpA
во первых вопрос не в тему.
во вторых у нас телепатов нет:
какая игра?, что по твоему значит патч а также собрать вместе?

ЗЫ. для своего вопроса создай новую тему, тогда тебе помогут, и всегда описывае подробно в чём проблема!

Цитата:
...у нас телепатов нет...
Автор: dneprcomp
Дата сообщения: 07.03.2005 23:50
Lss

Цитата:
все вроди должно работать

Ты бы не измышлял, а почитал хелп.
Я могу быть и не прав, а вот то что ты хелпом не пользуешься не есть хорошо.
Автор: death fenix
Дата сообщения: 19.03.2005 15:37
Кто - нибудь знает что значит ответ сервера "406"?
А то не понятно что менять в программе
Автор: RaZer
Дата сообщения: 19.03.2005 15:45
death fenix

Цитата:
Кто - нибудь знает что значит ответ сервера "406"?

Вообщето это оффтоп!

406 Not Acceptable
Ресурс, указанный клиентом по данному URI, существует, но не в том формате, который нужен клиенту. Вместе с этим кодом сервер выдает заголовки Content-Language, Content-Encoding и Content-Type.

Автор: ramzes IV
Дата сообщения: 19.03.2005 20:53
RaZer
а где можно посмотреть полный перечень подобных ответов?
в смысле адрес нужен
сенкс
Автор: woffer
Дата сообщения: 19.03.2005 21:45

Цитата:
а где можно посмотреть полный перечень подобных ответов?


а поискать не судьба ?
Автор: Lss
Дата сообщения: 20.03.2005 08:18
Привет усем, я ужь думал мой вопрос гденить то в самом конце а он тут еше на поверхности плавает.
Ну вобшем на калькуляторе все встало както влом чето делать когда вроди бы все правельно а
не работает.
Шас хочу удариться еше в более густые дебри, но уже действительно нужные по делу.
Не поделеитесь своими мыслями по поводу...
Вроди как мне обясняли в обших чертах про ком порт что вроде логической еденице соответствует
+15 , 0- -15.
Ну так вот можно как нибуть програмно сделать стобы на выходе ком порта относительно какойто
ноги(отвертия) появился сигнал +15В. Если можно то черкните програмку. И вольтметром в какой
дырке относительно какой мерить?
Это пока из компа, планируеться каимто образом если хотябы это получиться то и в комп закидывать
код или хотябы сигнал есть или нет(0,1).

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

Ну вобшем я думаю из моих вопросов понятно на каком уровне у меня знания в этой области, может
ктонит просветит меня чем нить то в этой области.
Автор: OdesitVadim
Дата сообщения: 20.03.2005 14:16
Lss
Есди ты работаеш под вин НТ (а XP также) то так просто нельзя. Надо либо драйвер писать, либо ити в хитрые дебри. Но обыкновенной прикладной проге нельзя. Об ътом уже писали много. А во вторых не будет тебе 15 вольт.
для распайки выводов загляни сюда, к примеру _http://www.aggsoft.ru/rs232-pinout-cable/serial-port-db9.htm
Автор: Lss
Дата сообщения: 20.03.2005 18:36
Жаль а я так хотел с КОМ портом побалваться.
Ну ладно зато обрато желание к колькулятору вернулось начело усе боле менее получаться
Подскажите мне такую штуку я вычитал что мол оператор go tu очень плохая штук
и его всячески нужно избегать правдо ли это. Как вы их избегаете или нет?
Или лучше сделать через РЕПИТ или АНТИЛ че с этими операторами программа работает
быстрее и надежнее?

P.S. Сылк не работает, ну да бог сней.
Автор: mutano
Дата сообщения: 20.03.2005 18:46
Lss
штук не плохой, а опасный если злоупотреблять, запутаться можно легко, лично я пишу процедуру, а потом ее вызоав вставляю в гоу то или в цикл, структурированность всегда помогает баги устранять и водше более истетично, а вот гоу ту эту самую структуру устраняет
Автор: Lss
Дата сообщения: 21.03.2005 19:35
Спсибо. С Вайлом нормально усе получилось.

Тут пара вопросиков по мелочи накопились:
1)Ведь размер откомпелированной программы не зависет от длины имен применяемых в программе?
Вроди как бы у процедуры имя переменной может совпадать с именем переменных в программе но комп
считает допустим переменую ав процедуре и переменную а в программе разными переменными,
как лучше делать для быстродействия для надежности и занимемому месту программой называть их разными
именами или одинаковыми ,если я сам влюбом случае понимаю что это разные переменые и нормально орентируюсь в них т.е.
не запутаюсь.
2) еше про видимость переменных процедурами если допустим у меня переменная описанна в Варе
более высокой процедуры допустим// procedure TForm1.Button20Click(Sender: TObject);
var i,j,k,t:integer; //
Или еше в выше в Варе самом начале программы то наверное эти переменные нет необходимости
отдельно вводить в процедуры описанные ниже по уровню они и так будут видны.
Допустим некий строковый параметр который будет прочитан сначала и присвоен некой переменной, разумееться прочитан раньше чем эта переменная будет
использованнв ниже стоящими процедурами?


Добавлено:
3) И еше если у меня вот так процедуры описанны и испльзуються:

Procedure A;
Procedure B;
Procedure c;

Procedure D;
begin
Procedure A;
Procedure B;
Procedure C;
....
end;

Все работает и так но наверное лучше т.к. процедуры АВС сами посибе неиспользуються
а их последовательность вызова заключина в процедуре D то может их стоит описать внутри нее.
Что от этого силно измениться?
Или в этом случае я только рискую невозможностью в случае чего обратица к процедурам А.В,С по отдельности,
так оно или не так?

Допустим што я не буду обрашаться к ним по отдельности и запишу их вовнутрь процедуры D это сильно ускорит работу программы или как?
Автор: OdesitVadim
Дата сообщения: 21.03.2005 19:52

Цитата:
Ведь размер откомпелированной программы не зависет от длины имен применяемых в программе?

вроде не зависит. всё-равно они потом превращаются в адреса. Но если забудеш отключить отладочную информацию, то у тебя "создастся" впечетление, что зависит.
Если имя у переменной будет длинным, то это может повлиять на скорость написания проги (писать долгие имена) и компиляцию - она же зависит от размера текста

Цитата:
Или еше в выше в Варе самом начале программы то наверное эти переменные нет необходимости отдельно вводить в процедуры описанные ниже по уровню они и так будут видны.

да будут видны

но если в процедуре обявишь переменную с таким же самым именем то произойдёт следующее
на момент, когда выполняется твоя процедура будет использоваться внутреняя переменная, а глобальная как-бы будет заморожена. когда выйдеш из процедуры, восстановиться глобальная переменная, а о локальной инфа потеряется

о goto...
иногда один goto может насколько упростить суть алгоритма, что диву даешся. Обычно следует использовать для выхода из нескольких циклов (другие рекомендуют комбинацию Continue/Break/флаги) но когда скорость и ясность нужна (а особенно на олимпиадах) применяю goto.

Добавлено:
математики доказали, что любую прогу можно переписать без goto

Цитата:
И еше если у меня вот так процедуры описанны и испльзуються:

с точки зрения структурированости кода - лучше. (ксати С++ не позволяет влаживать функции друг в дружку...) но вызывать эти процедуры с других мест не сможеш. Насчёт скорости - не тестил.
Автор: Lss
Дата сообщения: 22.03.2005 19:03

Цитата:
Но если забудеш отключить отладочную информацию, то у тебя "создастся" впечетление, что зависит.
Што за отладочная информация и как где ее отключит и почему "создасться" впечатление?


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

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

А следует ли зацикливаться на этом, на какието веши как размер скорость это влияет, я имею виду например на коком нить тормозном компе если эта прога будет работать или с множеством значений(большие числа) то что то можно заметить в скорости, или в размере ехе-ка, или памяти в оперативе?

------->
1)Такой вопрос слово Exit выводит прогу из блежайшей процедуры в которую оно вставлинно
А если у меня сам процес выхода описанна как процедура т.е.

Procedure Proverca(p:integer);
begin
if (s1[p]='*')or(s1[p]='/')or(s1[p]=',') then
begin
ShowMessage('Ioeai?iay caienu ?enea');
Exit; { gotu в конец процедуры более высокого ранга}
end;
end;
И я просто пишу вызов этой процедуры. В случае чего программа выходит лишь из самой этой процедуры а надо шоб еше и из
той в каторую она вставленна как это сделать. Два раза написал Ехет ге помогает.
Может ГОУ ТУ попробывать и в конец основной процедуры, не выполнять не че просто выйти?

2)Еше момент хотелось бы при ошибке в строке короче если выполнится
условие преведенное выше в тексте программы то чтобы курсор переместился в Едит1. в позицию
ошибки (р).
Побовал так:
Form1.Edit1.Focused; -Даже чето фокус не передаеться
Form1.Edit1.SelStart:=p;-Походу вот эта строчка самый то но не фурычит чето.
Form1.Edit1.SelStart(p);
неполучаеться

3)Еше про другое мощь кто видал у руских нормальных вольтметров есть порт КОП-контролер обшего пользования
этим вольтметрам можно команды отдовать о его настройке ну соответственно снимать и передавать напряжение,
видимо оно уже выходит от туда в цифровом варианте а не в аналоговом, работает эта фигня как мне сказали
по протоколу ЭРЕС 32 или 3,2 чето типа того и как сказали это типо практически тоже самое что СОМ порт
и любой комп поддерживает такой протокол.
Ктонить то можь подкажет побольше полезной информации об этом сам или где ее взять, тока на моем уровне если есть такое
а то я находил какието штуки в нете но там так завернуто шо без пол-литра.....
Ну для начала мне бы хоть узнать как КОП разьем подклучить к СОМ порту (если это возможно)
и допустим есть кнопка1 и Лабел1 при нажатии на Кнопку1 в Лабел1 отрожаеться считанное число.
Кто нит по этому поводу че знает,может даже кто уже такое и сделал?

P.S.Кстати кому интересно я там в предыдуших моментах ,на первой закладке вроди, писал што строка a1:=a1+s1[p];
не работает и ее надо заменять двумя. Шас чето глюконуло в лучшую сторону и все срабатывает и
в одной строчке.



Добавлено:
Помозговал тут насчет пункта 1) наверно через ГОУ ТУ невыдет он наверное работает в пределах данной процедуры и не будет вылазит из нее
если Лейбл вне этой процедуры!?

Добавлено:
В ту же тему экономии и оптимизации:

dlina:=Length(s1);
if (s1[dlina]='*')or(s1[dlina]='/')or(s1[dlina]='+')or(s1[dlina]='-')or(s1[dlina]=',') then

Тут dlina описанна как переменная хотя можно было бы и так
if (s1[Length(s1)]='*')or(s1[Length(s1)]='/') ......... then
Как лучше?

Страницы: 12

Предыдущая тема: Чем открыть файл *.db


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