Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 733

/ вопрос открыт /

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

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls,ShellAPI;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. BGo: TButton;
  12. ListBox1: TListBox;
  13. Ed1: TEdit;
  14. Ed2: TEdit;
  15. BFix: TButton;
  16. BNext: TButton;
  17. GroupBox1: TGroupBox;
  18. EdF: TEdit;
  19. procedure BGoClick(Sender: TObject);
  20. procedure BNextClick(Sender: TObject);
  21. procedure BFixClick(Sender: TObject);
  22. procedure FormCreate(Sender: TObject);
  23. procedure FrmClose(Sender: TObject; var Action: TCloseAction);
  24. procedure FormActive(Sender: TObject);
  25. private
  26. { Private declarations }
  27. public
  28. { Public declarations }
  29. end;
  30.  
  31. var
  32. Form1: TForm1;
  33. HD,HD1,HD2 :HWnd ;
  34. pBuf1,pBuf2,pFILNAM,pSTRO1,pSTRO2 : PChar ;
  35. i,j : Integer ;
  36. stro,stro1,stro2,strobr,strlist : string ;
  37. Find1 : Boolean ;
  38. arch : array[0..128] of char ;
  39. implementation
  40.  
  41. {$R *.dfm}
  42.  
  43. procedure TForm1.BGoClick(Sender: TObject);
  44. var i,j : integer ;
  45. begin
  46. stro := EdF.Text ; i := Length(stro) ;
  47. stro[i+1] := Char(0) ; pFILNAM := @stro[1] ;
  48. HD := FindWindow(0,pFILNAM);
  49. if HD=NULL then Ed1.Text := 'NO' else
  50. Ed1.Text := IntToStr(HD) ;
  51. // pBuf1 := @stro1[1] ; pBuf2 := @stro2[1] ;
  52. GetClassName(HD,pBuf1,256) ;
  53. GetWindowText(HD,pBuf2,256) ;
  54. stro1 := pBuf1 ; stro2 := pBuf2 ;
  55. Ed1.Text := IntToStr(HD) + ' = ' + stro1 ;
  56. stro1 := '=' + stro1 ;
  57. Form1.ListBox1.Items.Add(stro1);
  58. Ed2.Text := stro2 ;
  59. stro2 := '->' + stro2 ;
  60. Form1.ListBox1.Items.Add(stro2);
  61. Form1.ListBox1.Items.Add(' --');
  62. HD1 := 0 ;
  63. end;
  64.  
  65. procedure TForm1.BNextClick(Sender: TObject);
  66. begin
  67. HD2 := FindWindowEx (HD,HD1,0,0) ;
  68. GetClassName(HD2,pBuf1,256) ;
  69. GetWindowText(HD2,pBuf2,256) ;
  70. stro1 := pBuf1 ; stro2 := pBuf2 ;
  71. Ed1.Text := IntToStr(HD2) + ' = ' + stro1 ;
  72. stro1 := '=' + stro1 ;
  73. Form1.ListBox1.Items.Add(stro1);
  74. Ed2.Text := stro2 ;
  75. stro2 := '->' + stro2 ;
  76. Form1.ListBox1.Items.Add(stro2);
  77. Form1.ListBox1.Items.Add(' --');
  78. HD1 := HD2 ;
  79. end ;
  80.  
  81. procedure TForm1.BFixClick(Sender: TObject);
  82.  
  83. begin
  84. i := Length(strobr) ; strobr[i+1] := Char(0) ;
  85. Inc (strobr[i]) ; pFILNAM := @strobr[1] ;
  86. SetWindowText (HD2,pFILNAM) ;
  87. strlist := '#->' + strobr ;
  88. Form1.ListBox1.Items.Add(strlist);
  89. Form1.ListBox1.Items.Add(' --');
  90. end ;
  91.  
  92. procedure TForm1.FormCreate(Sender: TObject);
  93. begin
  94. Form1.ListBox1.Items.Add('BEGIN');
  95. strobr := 'T1' ;
  96. end;
  97.  
  98. procedure TForm1.FrmClose(Sender: TObject; var Action: TCloseAction);
  99. begin
  100. StrDispose(pBuf1);
  101. StrDispose(pBuf2);
  102. end;
  103.  
  104. procedure TForm1.FormActive(Sender: TObject);
  105. begin
  106. PBuf1 := StrAlloc (256) ; PBuf2 := StrAlloc (256) ;
  107. end;
  108.  
  109. end.
  110.  


Яуген Таляныч Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Яуген Таляныч (статус: Посетитель)
Вопрос отправлен: 5 мая 2009, 14:06
Состояние вопроса: открыт, ответов: 0.


Мини-форум вопроса

Всего сообщений: 10; последнее сообщение — 9 мая 2009, 13:51; участников в обсуждении: 4.
Вадим К

Вадим К (статус: Академик), 5 мая 2009, 14:36 [#1]:

Посмотрел код. Плакать хочеться. Выкиньте его и забудьте о нем.
начнем с простой строки
//   pBuf1 := @stro1[1] ; pBuf2 := @stro2[1] ;
   GetClassName(HD,pBuf1,256) ;
Когда коментарий есть, тогде pBuf1 указывает в пустоту. Если повезёт, буфер укажет в удачное место - можно будет получить что то, но обычно будет обычный расстрел памяти. А он может привести к чему угодно. Например к падению винды. Сказка? Отнюдь. Я когда то не угадал размер буфера на пару байт и как только буфер переполнялся - падало с синим экраном. Отлаживать было весело.
Если же коментарий снять, то тут ещё веселе начинается. Теперь указатель указывает в начало буфера. Но где гарантия, что в этом буфере есть место. Надо понмить, что обычная строка - достаточно сложный объект. И если на чтение указатель можно брать, то на запись....
Срочно читать базовые принципы и трогать винды. А то упадут точно.
Галочка "подтверждения прочтения" - вселенское зло.
Паровоз

Паровоз (статус: 10-ый класс), 5 мая 2009, 14:45 [#2]:

Начнем с того, что как уже говорилось раньше, весь этот безобразный набор
stro := EdF.Text ; i := Length(stro) ;
stro[i+1] := Char(0) ; pFILNAM := @stro[1] ;
HD := FindWindow(0,pFILNAM);
нужно заменить на
HD := FindWindow(0,PChar(EdF.Text));
Но раз Вы этого не сделали, то не вызывает никакого желания дальнейшее чтение Вашего кода.
Яуген Таляныч

Яуген Таляныч (статус: Посетитель), 6 мая 2009, 16:12 [#3]:

Чтобы не засорять форум, моя точка зрения на
http://slil.ru/27513337

Способ диковатый, согласен, но длинное сообщение не хотелось, а приложение можно цеплять только к вопросу, а не к обсуждениям, не так ли ?
Ерёмин А.А.

Ерёмин А.А. (статус: *Администратор), 6 мая 2009, 16:15 [#4]:

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

Вадим К (статус: Академик), 6 мая 2009, 16:24 [#5]:

Вы ответы пишете точно так само как и код. А можно было в вордовском документе вставить загадку, по которой можно было бы угадать урл, откуда скачать архив запароленный? Ну честное слово, там не так много, можно было написать и тут.
Во вторых, на всех этих сервисах "слил/украл" файлы не храняться долго и цепочка рассуждений теряется.
"Я знаю разницу между передачей параметров по ссылке и
по значению. Указатели выставлены в обработчике активации формы и не указывают на белый свет, а на область, зарезервированную StrAlloc’ом. "
А зачем так разносить по всему коду? Не код, а сборная солянка. Вот поэтому никто не дает хорошого ответа. Часть народа просто тошнит от такого вида кода (как собственно и меня), а другая смотрит и думает "о, какой сложный вопрос, какой код..."
"Там, где указатель выставлен на статически определенную
String хотя и диковатым на взгляд профи способом, тоже никаких неприятностей не ожидается, указатель определяет строку – источник сообщения, и туда ничего зловредного не забросится."
Ок, если уж знаете ассемблер, расскажите прям тут на форуме, как по вашему в памяти представлена строка string при дефолтных установках компилятора.
Галочка "подтверждения прочтения" - вселенское зло.
Яуген Таляныч

Яуген Таляныч (статус: Посетитель), 6 мая 2009, 17:22 [#6]:

Тут по-моему, не надо знать ассемблер, а надо знать официальную Борландовскую доку по компилятору. Если мне не изменяет склероз, сегодня утром смотрел отладчиком : string 0 - й байт счетчик, далее содержимое. Дефолтных установок не менял. "Не трожь технику, и она тебя не подведет". Знатоком ассемблера PC себя не считаю, потому как последнее, что писал на PC-шном ассемблере, относилось еще к 16-разрядным, а на современных 32-разрядных ассемблером пользуются либо системные программеры, либо хакеры, я думаю.
И вообще теперь вижу, что пошел неверным путем, пытаясь использовать чужую утилитку без исходников, напуганный слухами о нереалтаймовости Винды, которая нехорошо скажется на передаче по последовательному каналу. Вообще моя специализакия - программирование микроконтроллерных устройств, и с виндой они соприкасаются только для обмена данными.
Что касается "цепочки рассуждений" - так мы на ней вроде уже завязали финальный узелок, не так ли ? Так и начав разговора о взаимодействии окон...
"Но опыт есть!" (С) Жванецкий. В смысле - польза. Поближе познакомился с ANSIString.
Насчет URL и запароленого архива - не понял. Мой .doc на SLIL без архивирования и без паролей. Я не знаю более простого способа расшарить свой файл. Хотел на свой блог отправить, но он не тематический. Про собак и преферанс.
Вадим К

Вадим К (статус: Академик), 6 мая 2009, 17:52 [#7]:

по поводу строки. Я специально спросил для дефолтных настроек. Так как точно, начиная с второй делфи, в переменной для строки храниться указатель. По данному указателю находиться начало строки, которая завершается 0 (это для совместимости с PChar). 4 байта назад (да, да, указатель минус 4) находиться 4 байта, где записана длина. Если минус 4 байта назад находиться счётчик ссылок, если там -1, то это константа. Делфи (компилятор и RTL) сама следит за работой со строками и выделят/удаляет память, пересчитывает счетчики.
Если просто в строку добавить достаточно символов (например тысячу пробелов), то можно строку передать как указатель, правда надо будет не забыть поправить размер строки и, желательно ноль дописать. При этом проверить также счетчик ссылок, а то могут быть "неожиданные эффекты". Но в реальном приложении так делать без очень особой нужды нельзя. И надо очень хорошо понимать, что делаешь.
Да, важное замечание. обычные string могут хранить до 2Гб символов (на самом деле меньше, но 2-3 миллиона - никаких проблем) - это при дефолтных настройках компилятора.
А вот если использовать тип shortstring - там да, там в нулевом храниться длина, а остальные 255 - это содержимое. При этом конечный ноль не есть обязательным.
С приходом делфи 2009 некоторые вещи стали ещё занятнее, и если делать такие трюки с указателями, можно годами отлавливать баги.
По поводу "запароленного архива" - это шутка такая была. Я до сих пор не понимаю, зачем так было делать.
И о узелке Вы только в том вордовском документе писали, так что оффициально того сообщения нет.

P.S. Если дойдут руки, напишу пример, как с эдита брать и ложить в него текст. Там всё крайне примитивно.
Галочка "подтверждения прочтения" - вселенское зло.
Яуген Таляныч

Яуген Таляныч (статус: Посетитель), 6 мая 2009, 18:18 [#8]:

О, прям чат :-) !

> Я до сих пор не понимаю, зачем так было делать.

Чтобы не загромождать форум. Расшарил файл на доступном ресурсе и дал ссылку. Куда проще - я не знаю.
Насчет string - видимо, у меня по умолчанию оно shortstring.
Покажу завтра, что изобразил отладчик ( у меня Дельфи дома, а халявный инет - у ребят на работе, свой dial-up берегу, зайчиков
жалко :-).
Забью я на эти окна и напишу стандартный обмен по COM-USB как прием-передачу файлов (USB - виртуальный COM-порт). Пробовал пакет TMSA32, но что-то я с ним тоже, видимо, не того : монитор портов видит передаваемый пакет, а устройство не реагирует. Возьму осцилл и посмотрю, чем отличаются мои пакеты от передаваемых той же пресловутой утилиткой.

>P.S. Если дойдут руки, напишу пример, как с эдита брать и ложить в него текст.
> Там всё крайне примитивно.
Там одна строка кода, I think. Только компилятор ругается, хотя вроде все по букварю.
Вадим К

Вадим К (статус: Академик), 6 мая 2009, 18:28 [#9]:

так весь этот огород с передачей текста в edit для того, что бы данные в порт отправить??? тихий ужас.
А данные могут уйти, но не устройсво не будет реагировать - нормальная ситуация. Я сам несколько лет писал программы для подобной работы. Это же компорт, там не просто данные надо передать, а и все стоп биты выдержать, и четности и кучу всего другого. Но если только там не написана "ручная работа с портом (когда контроллер программируется в обход ос)", а в пределах АПИ, то там всё просто - я использовал библиотеку от synapse + thread.
по букварю? у Вас букварь не правильный, выбросите его. Или научитесь читать:)
Галочка "подтверждения прочтения" - вселенское зло.
Яуген Таляныч

Яуген Таляныч (статус: Посетитель), 9 мая 2009, 13:51 [#10]:

Раскаялся в своей ереси, посыпал голову золою и иду пис`ать обмен по компорту на PureBasic. Бедный Васик...

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:40
Выполнено за 0.03 сек.