Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2009, 08:55   #1
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
Стрелка Помогите найти ошибку в программе

Вот программа, которая с помощью SAPI озвучивает нажатия клавиш. Настройки берутся из ini-файла вида:
Код:
[ID1] //Первый хоткей
Key=65 //Код хоткея
Str=Привет //Строчка для произношения
Mod=0 //Модификаторы хоткея
[ID2] //Второй хоткей
Key=82
Str=ShowWindow
Mod=3
Таких разделов может быть сколько угодно.
Вот исходный код, но прога вылетает на самой первой строчке в FormCreate с AccessViolation.
Код:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IniFiles, StdCtrls, OleServer, SpeechLib_TLB;

type
  TMainForm = class(TForm)
    ExitButton: TButton;
    Voice: TSpVoice;
    HideButton: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure ExitButtonClick(Sender: TObject);
    procedure HideButtonClick(Sender: TObject);
  private
    { Private declarations }
    procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
  public
    { Public declarations }
  end;

const
  DefaultSettings = 82;

var
  MainForm: TMainForm;
  Ini: TIniFile;
  Key, Modifier: integer;
  Strs: array of string;
  IDs: array of integer;
  SettingsHotKey: integer;

implementation

{$R *.dfm}

procedure TMainForm.ExitButtonClick(Sender: TObject);
begin
  Close;
end;

procedure TMainForm.FormCreate(Sender: TObject);
var i: integer; List: TStrings;
begin
  List := TStringList.Create;
  Ini := TIniFile.Create(ExtractFilePath(Application.ExeName) + 'Settings.ini');
  Ini.ReadSections(List);
  for i := 0 to List.Count - 1 do
    begin
      IDs[i] := GlobalAddAtom(PWChar('JokeHotkey' + IntToStr(i + 1)));
      Key := Ini.ReadInteger(List[i], 'Key', DefaultSettings);
      Modifier := Ini.ReadInteger(List[i], 'Mod', DefaultSettings);
      RegisterHotKey(MainForm.Handle, IDs[0], Modifier, Key);
      Strs[i] := Ini.ReadString(List[i], 'Str', 'Привет');
      if Strs[i] = 'ShowWindow' then SettingsHotKey := IDs[i];
    end;
  Ini.Free;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
var i: integer;
begin
  for i := 0 to Length(IDs) do
    UnRegisterHotKey(MainForm.Handle, IDs[i]);
end;

procedure TMainForm.HideButtonClick(Sender: TObject);
begin
  Hide;
end;

procedure TMainForm.WMHotKey(var Msg: TWMHotKey);
var i: integer;
begin
  if Msg.HotKey = SettingsHotKey then
    begin
      if not MainForm.Visible then MainForm.Show else MainForm.Hide;
      Exit;
    end;
  for i := 0 to Length(IDs) do
    if IDs[i] = Msg.HotKey then if not MainForm.Visible then
      begin
        Voice.Speak(Strs[i], SVSFlagsAsync);
        Exit;
      end;
end;

end.
Помогите найти ошибку!
k1r1ch вне форума Ответить с цитированием
Старый 04.10.2009, 08:57   #2
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

F7?.......
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 04.10.2009, 09:01   #3
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
По умолчанию

Прикольная функция)
Вот на этой строчке ошибка:
Код:
IDs[i] := GlobalAddAtom(PWChar('JokeHotkey' + IntToStr(i + 1)));
Но как это понимать?
k1r1ch вне форума Ответить с цитированием
Старый 04.10.2009, 09:19   #4
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

Ids - array of integer.
А где ты устанавливаешь его длину?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 04.10.2009, 09:22   #5
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
По умолчанию

Он как бы динамический!
k1r1ch вне форума Ответить с цитированием
Старый 04.10.2009, 09:25   #6
Alex Cones
Trust no one.
Старожил
 
Аватар для Alex Cones
 
Регистрация: 07.04.2009
Сообщений: 6,526
По умолчанию

А длину устанавливать кто будет? Или ты думаешь, что если динамический, то он сам поймет, сколько памяти тебе надо?
SQUARY PROJECT - НАБОР БЕСПЛАТНЫХ ПРОГРАММ ДЛЯ РАБОЧЕГО СТОЛА.
МОЙ БЛОГ
GRAY FUR FRAMEWORK - УДОБНАЯ И БЫСТРАЯ РАЗРАБОТКА WINAPI ПРИЛОЖЕНИЙ
Alex Cones вне форума Ответить с цитированием
Старый 04.10.2009, 09:33   #7
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
По умолчанию

Да, спасибо, заработало! Но как-то все неправильно работает! То есть при нажатии Ctrl+Alt+R должно появляться окошко программы, а она говорит привет и все... В теории все должно работать... Может есть какие то мысли, почему так?
k1r1ch вне форума Ответить с цитированием
Старый 04.10.2009, 09:36   #8
k1r1ch
ACM!
Форумчанин
 
Аватар для k1r1ch
 
Регистрация: 19.06.2009
Сообщений: 382
По умолчанию

Все отыскал ошибку, спасибо за помощь!!!
k1r1ch вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите найти ошибку в программе Nemles Помощь студентам 0 14.06.2009 14:21
Помогите найти ошибку в программе (C++) Olya90 Помощь студентам 1 28.03.2009 16:36
помогите на найти ошибку в программе SYL@R Помощь студентам 1 28.11.2008 12:35
Помогите найти ошибку в программе Evgenii Помощь студентам 3 24.07.2008 09:06
Помогите найти ошибку в программе KnDmPetr Паскаль, Turbo Pascal, PascalABC.NET 5 10.03.2008 14:19