Jump to content
Korean Random

ventura69

User
  • Content Count

    247
  • Joined

  • Last visited

Posts posted by ventura69


  1. Уважаемые, бился неделю над озвучкой компонента (у меня Анси).  

    Для желающих выкладываю код озвучки компонента под Анси. Все визуальные отличия: вместо значка ноты - надпись "прослушать". Все работает на ура.

    Автор кода, как и для Юникода, все тот же: Shegorat (земной ему поклон с кисточкой и огромная благодарность!)

    [setup]
    AppName=My Program
    AppVerName=My Program 1.5
    DefaultDirName={pf}\My Program
    DefaultGroupName=My Program
    ComponentsListTVStyle=true

    [Files]
    Source: sounds\*; flags: dontcopy;

    [Languages]
    Name: russian; MessagesFile: compiler:Languages\Russian.isl

    [Components]
    Name: sound; Description: Звук выстрела; Types: full;
    Name: sound\snd1; Description: "Тихий"; Flags: exclusive;
    Name: sound\snd2; Description: "Громкий"; Flags: exclusive;


    const
    LB_ITEMFROMPOINT = $01A9;
    Phrase = '(прослушать)';

    type
    TComponentSound = record
    SoundName: String;
    Index: Integer;
    end;
    TSize = record
    cx: Longint;
    cy: Longint;
    end;
    ABC = record
    abcA: Integer;
    abcB: UINT;
    abcC: Integer;
    end;
    HDC = Longword;
    HGDIOBJ = Longword;

    var
    iSound: array of TComponentSound;
    sndCompOldProc: TNotifyEvent;

    function GetCursorPos(var lpPoint: TPoint): BOOL; external '[email protected] stdcall';
    function MapWindowPoints(hWndFrom, hWndTo: HWND; var lpPoints: TPoint; cPoints: UINT): Integer; external '[email protected] stdcall';

    function GetTextExtentPoint32(DC: HDC; lpString: String; Len: Integer; var lpSize: TSize): Boolean; external '[email protected] stdcall';
    function GetClientDC(hWnd: HWND): HDC; external '[email protected] stdcall';
    function ReleaseClientDC(hWnd: HWND; hDC: HDC): Integer; external '[email protected] stdcall';
    function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; external '[email protected] stdcall';
    function GetCharABCWidths(DC: HDC; uFirstChar, uLastChar: UINT; var lpAbc: ABC): Boolean; external '[email protected] stdcall';

    function sndPlaySound(lpszSoundName: String; fuSound: UINT): BOOL; external '[email protected] stdcall';

    function GetTextWidth(aFont: TFont; Text: String): Integer;
    var
    DC: HDC;
    aSize: TSize;
    OldObj: Longword;
    abc1, abc2: ABC;
    begin
    if Text='' then Exit;
    DC:= GetClientDC(0);
    try
    OldObj:= SelectObject(DC, aFont.Handle);
    GetTextExtentPoint32(DC, Text, Length(Text), aSize);
    Result:= aSize.cx;
    if (Length(Text)<>1)and(fsItalic in aFont.Style) then begin
    GetCharABCWidths(DC, Ord(Text[1]), Ord(Text[1]), abc1);
    GetCharABCWidths(DC, Ord(Text[Length(text)]), Ord(Text[Length(text)]), abc2);
    if abc1.abcA<0 then Result:= Result-abc1.abcA;
    if abc2.abcC<0 then Result:= Result-abc2.abcC
    end;
    finally
    SelectObject(DC, OldObj);
    ReleaseClientDC(0, DC);
    end;
    end;

    procedure PlaySound(Sender: TObject);
    var
    x, o, n, lParam, i, f, ids, w1, w2, x1, x2: Integer;
    p: TPoint;
    sp, s: String;
    fnt: TFont;
    begin
    GetCursorPos(p);
    MapWindowPoints(0, WizardForm.ComponentsList.Handle, p, 1);

    lParam:= p.x or (p.y shl 16);
    i:= SendMessage(WizardForm.ComponentsList.Handle, LB_ITEMFROMPOINT, 0, lParam);
    if ((i shr 16) = 1) or ((i and $FFFF) < 0) then Exit;

    ids:= i and $FFFF;

    o:= WizardForm.ComponentsList.Offset;
    n:= WizardForm.ComponentsList.ItemLevel[ids];
    if (WizardForm.ComponentsList.TreeViewStyle) then
    x:= ScaleX((1 + o) + ((13 + o * 2)*(n + 1)) + (14 + o * 2))
    else
    x:= ScaleX((13 + o * 2)*(n + 1));

    sp:= ' '+Phrase;

    f:= -1;
    for i:= 0 to GetArrayLength(iSound)-1 do begin
    if (ids = iSound[i].Index) then begin
    f:= i;
    Break;
    end;
    end;

    if (f < 0) then Exit;

    s:= WizardForm.ComponentsList.ItemCaption[ids];
    if (Pos(Phrase, s) <= 0) then Exit;

    fnt:= WizardForm.ComponentsList.Font;
    fnt.Style:= WizardForm.ComponentsList.ItemFontStyle[i];

    w1:= GetTextWidth(fnt, Trim(s));
    w2:= GetTextWidth(fnt, sp);

    x2:= w1 + x;
    x1:= x2 - w2;

    if (p.x >= (x1 - 1)) and (p.x <= (x2 + 1)) then begin
    if FileExists(iSound[f].SoundName) then
    sndPlaySound(iSound[f].SoundName, 0);
    end;

    if (sndCompOldProc <> nil) then
    sndCompOldProc(Sender);
    end;

    procedure AddItemSound(AIndex: Integer; AFilename: String);
    var
    i: Integer;
    begin
    i:= GetArrayLength(iSound);
    SetArrayLength(iSound, i+1);
    iSound[i].Index:= AIndex-1;
    iSound[i].SoundName:= ExpandConstant(AFilename);
    WizardForm.ComponentsList.ItemCaption[AIndex-1]:= WizardForm.ComponentsList.ItemCaption[AIndex-1] + ' '+Phrase;
    end;

    procedure InitializeWizard();
    begin
    WizardForm.TypesCombo.Visible:=False;
    WizardForm.ComponentsList.Height := ScaleY(181) - WizardForm.TypesCombo.Top;
    WizardForm.ComponentsList.Top := WizardForm.TypesCombo.Top;
    WizardForm.ComponentsList.Width := ScaleX(417);
    sndCompOldProc:= WizardForm.ComponentsList.OnClick;
    WizardForm.ComponentsList.OnClick:= @PlaySound;

    ExtractTemporaryFile('1.wav');
    ExtractTemporaryFile('2.wav');
    AddItemSound(2, '{tmp}\1.wav');
    AddItemSound(3, '{tmp}\2.wav');
    end;

  2. А если ктото случайно галку жмакнет и не заметит, а потом будет голову ломать почему моды не встали.

    Значит следующий раз будет внимательнее следить за тем, что его руки творят! Всегда считал, что прежде, чем что-то делать, надо думать :-)


  3. Именно такой тебе не нужен. Пункт "Восстановить резервную копию файлов" при установке ни к чему. @ventura69 делал этот скрипт для отдельной от установщика программы (типо расширенного деинсталлятора).

    Может, тебе просто нужен код бекапа?

     

    На самом деле я восстановление все же добавил в инсталлятор. Только прописал делать бекап (если он выбран) по завершении всей работы инсталлятора. То есть, если пользователь все же по глупости навыбирает моды для установки при выборе бекапа, эти моды инсталлятор засунет ему на комп, но после все равно сделает бекап. Применимо к моему инсталлятору этот вариант посчитал наиболее удачным.

  4. :no:

    Умеет.

    Без сторонних библиотек можно редактировать те же конфиги XVM... они хоть и имеют расширение XC, а внутри все тот же json.

    Но я тебя сразу отговорю... лучше работай с заменой файлов ибо у пользователей полно проблем с ОС... и часто необходимо сперва все dll системы восстанавливать...

    Лично я только в конфиге миникарты делаю подмену false на true... и то, чтобы не жалко было функцию зря писать.

    Спасибо огромное: подтвердили мои догадки (слаб я в Паскале), я тем же путем пришел к подмене false/true... Вот только не устраивает меня это решение (кривое и излишне сложное получается). Пытаюсь в Делфи найти решение... Вот вас бы (сильных в Делфи) объединить в единый проект... Полироид так и задвинул проект по настройке своего мода... А у меня один детский лепет получается пока...

     

    ЗЫ: Я вижу в этой теме народ стал потихоньку вылазить за рамки Inno Setup и плавно вливаться в Delphi и ObjPascal, вопросики стали появляться, dll-ки.... как там писал К.Маркс - наблюдается переход количественных изменений в качественные. :)))))))))

    Качество на самом деле давно зашкалило за количество... Может откроете темку на ту же тему (приношу извинения за тавтологию) по Делфи? :-)


  5. Это решение не проще?

    attachicon.gifmusic.rar

     

    Link2

    Может и проще. Музыку вообще в одну строчку можно добавить (играет и играет себе фоном, без всяких кнопок вкл/выкл), но тогда я вообще мало что смыслил в Inno. Это все пробы и изучение программы. Я ведь только учусь :-)

    А за код спасибо. Можно и пригодится куда-нибудь.


  6. @ventura69, лови накатал, процедура заменяет текст в файле, указывается номер строки и столбца, нумерация с нуля.

    Спасибо огромнейшее! Будет чем в отпуске заняться: пищу для ума дали на все три недели :-)

    А на счет кодировки - это мелочи. Мне принцип  бы понять...


  7. Кинь пример файла, я должен видеть как записано.

    Вот примерный вариант:

    Новый текстовый документ.txt

    И еще вариант интересует: есть файлик, в котором записано что-то (условно возьмем battleLoading.xc). В нем надо:

    "showChances": true

    переписать на 

    "showChances": false

    Но это уже для общего развития.


  8. PS: Зачем столбцы-то? Откуда вообще в текстовом файле у вас столбцы???

    Вот есть... Специфика работы. Градуировочная таблица называется и пишется в .txt  У меня есть текстовый документ, в котором 101 строка и 5 столбцов. Идут столбики цифр. Условно: надо заменить цифру 0.000256, расположенную во втором столбце двадцать третьей строки на 0.000375.


  9. @ventura69, это деинсталлятор такой? (если да - то файл unins001.exe не должен будет создаваться в папке с игрой, вместо него будет этот заранее запакованный деинсталлятор в инсталлятор, который будет извлекаться при установке) надеюсь, ты понял, что я имею ввиду);

     

    'Исправить бы мелкие косметические недоработки (не полностью вместились изображения):'

     

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

     

    Могу наваять пример, если надо..

    По поводу unins001.exe. Естественно, он не создается. Пограмуля только перетасовывает папки res_mods и чистит ненужные файлы из кэш и папки с апдейтами. Окно инсталлятора пропускается (ставить то нечего :-) )

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

    А почему деинсталлятор только для моей сборки? Эта програмуля подойдет любому (я так думаю) у кого стоит какой-то мод-пак и хочется потестить другой.

    На счет примера: буду очень признателен. Мне легче разбираться с кодом на примерах. Я тогда понимаю алгоритм работы и логику кода. А идея такова: есть готовый файл (текстовый) в который в определенное место (строка и столбец) надо вписать определенный текст (цифирь). Это уже себе жизнь на работе облегчаю (завсклад - [ооочень нехорошее слово], склад ведет абы как. Вот и появилась идея реализовать для этой [еще одно ооочень нехорошее слово] прогу, чтобы он мне нервы не трепал).


  10. Уважаемые, вот такая штукенция получилась с вашей помощью... Критику готов слушать, толь не пинайте шибко - все же я новичек в этом деле... 

    Вывел все операции с клиентом в отдельную прогу.

    UnInstaller by ventura69.rar

    post-11632-0-46275400-1404809566_thumb.jpg post-11632-0-57413000-1404809571_thumb.jpg


  11. Уважаемые, очередной дурацкий вопрос.

    Код:

    procedure SaveToFile(str:string);
    var
    f:TextFile;
    FileDir:String;
    begin
    FileDir:='c:\file.txt';
    AssignFile(f,FileDir);
    if not FileExists(FileDir) then
    begin
    Rewrite(f);
    CloseFile(f);
    end;
    Append(f);
    Writeln(f,str);
    Flush(f);
    CloseFile(f);
    end;

    Это запись в файл (код из Делфи, давно делал). Сработает ли такой вариант в Inno (проверить, по техническим причинам, к сожалению не могу, потому и спрашиваю)? И самое главное: как записать текст в определенную строку и столбец? 


  12. Lemon96!

    Нуждаюсь в помощи , был бы очень благодарен если бы ты уделил мне ну совсем немного своего времени. 

    Есть у меня скрипт ,от прицела , правда беда в том, что сам прицел уехал. 

    Не мог бы помочь в исправлении ?

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

    Не мог бы помочь в исправлении ?

    Принимайте. Все Ваши прицелы с необходимыми скриптами.

    res_mods.rar

    И скрины:

    post-11632-0-24732900-1404491968_thumb.jpg post-11632-0-40747200-1404491980_thumb.jpg post-11632-0-04028300-1404491996_thumb.jpg


  13.  

    Хм, стало интересно, сам попробовал: через дизайнер, InitializeWizard, изменение языкового пакета - ноль, это просто не влияет.. Интересно, почему?)

    А вот через процедуру CurPageChanged - получилось:

    procedure CurPageChanged(CurPageID: Integer);
    begin
     if CurPageID = wpReady then
    begin
    WizardForm.ReadyLabel.Caption:='123';
    end;
    end;
    

    Ого! Самому стало интересно. Сейчас полезу остальные заблоченые надписи пробовать менять :-) 


  14. Играйся с функцией:

    function ShouldSkipPage(PageID: Integer): Boolean;
    

    Хм... А почему? Я склонялся к 

    function NextButtonClick(CurPageID: Integer): Boolean;

    Если отмечен чекбокс на восстановление сборки, то имитируем нажатие кнопки Некст и перескакиваем в конец инсталлятора.


  15. Kotyarko_O, спасибо за код! Все гуд. Немного для себя подправил (отключил вывод ошибки). Теперь можно и дальше думать: как при бэкапе перескочить через окно с установкой модов. А то любителей с шаловливыми ручками хватает :-)


  16. Когда же вы поймёте, что после каждого патча нужно выкачивать новый клиент? Вот так и рождается вайн о плохой работе клиента.

    Темны и непонятны Ваши речи, уважаемый...

    Я существо старое, дремучее (45 лет мне) и далекое от сленга, потому не соизволите изъясниться понятнее? "Выкачивать", "вайн"... По отдельности все буковки понятны, а суть фразы ускользнула от меня, Можно попросить попонятнее для новичка объяснить?

    Клиент я скачал еще при версии 0.9.0, обновил один раз до 0.9.1. Папка апдейта у меня была 12 Гб. 


  17. хм.. может и мне стоит.. хорошая идея, подумаю :)

    За код спасибо. Поковыряю. Я пробовал сварганить такое, но, видимо, запутался в лексике.

    Идея не просто хорошая, а очень хорошая! :-) У себя, на свежем ноуте (2 месяца ему) очистил 12 Гб ненужного хлама обновлений от кВГ. В папке апдейт.

    Да! И самое главное: свою почту скиньте мне в личку. Перешлю письмо с комментариями и картинками, как воспользоваться нашим файлообменником. :-)


  18. @ventura69, скинь весь свой код бекапа.. поиграюсь, есть пара идей..

    Да пожалуйста :-)

    claerkash.rar

    Здесь пока не все - кое какие идеи еще не дописал. Но, по мелочи. Кстати, надо вписать еще удаление файлов обновлений в очистку кэш.


  19.  

    Это неправильная конструкция..

    Попробуй так:

    if DirExists('{app}\res_mods_old') then
    begin
    Действие, если папка присутствует
    end
    else
    Действие во всех остальных случаях
    end;
    

    Пробовал такое - не захотело работать, это раз. Во вторых: так толком и не придумал, что делать, если папки этой нет. Надо просто пропустить действие удаления. Как?


  20. Уважаемые, кто может подсказать: в чем дефект конструкции? Перепробовал кучу вариантов, но результат один и тот же: не работает.

    function BackupCheck_5(): Boolean;
    begin
    If LoadRadioButton.Checked then                  //проверяем, отмечен ли чекбокс
    begin
    if DirExists ('{app}\res_mods_old') = True then           //проверяем наличие файла res_mods_old. Если он присутствует, то выполняем действия ниже
    begin
    DelTree(ExpandConstant('{app}\res_mods'), True, True, True);                     //удаляем папку res_mods
    RenameFile(ExpandConstant('{app}\res_mods_old'), ExpandConstant('{app}\res_mods'));      //переименовываем res_mods_old в res_mods
    end;
    end;
    end;

    А в таком варианте все гуд. Но здесь и ломаться нечему - банальная перетасовка папок:

    function BackupCheck_5(): Boolean;
    begin
    If LoadRadioButton.Checked then                         
    begin
    DelTree(ExpandConstant('{app}\res_mods'), True, True, True);                 
    RenameFile(ExpandConstant('{app}\res_mods_old'), ExpandConstant('{app}\res_mods'));     
    end;
    end;

    Это я пытался защиту от "дурака" сделать, но что-то не клеится.

×
×
  • Create New...