IPB

Добро пожаловать, гость ( Вход | Регистрация )

9 Страниц V < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> Delphi, Asm, C, WinAPI, PHP, ..., FAQ
-=CHE@TER=-
Jan 15 2010, 19:26
Сообщение #41


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



Товарищи, объясните мне кто-нибудь такой феномен:
CODE
Program bitstest;
{$APPTYPE CONSOLE}
Var X: Cardinal;
Begin
  X:=123;
  X:=X ShR 32; // Должно быть 0...
  WriteLn(X); // Но остаётся 123 как и было!..
End.


X ShR 32 (X >> 32) должно быть 0, т.к. X переменная 32-х разрядная. Но дело в том, что эта операция не работает!
Если сделать X >> 31 - то всё ок, но 32 просто ничего не делает - X не изменяется!
Сейчас даже на FASM программу написал - такой же результат.
Это что за багофича такая?!..

Кстати, если на Си такое сделать, то результат не изменится, но будет предупреждение:
warning: right shift count >= width of type

Просто есть формула:
X:=X ShR (32 - BITS);
Которая при BITS = 0, должна давать 0, но из-за этого косяка получается фигня...

Кто-нибудь может объяснить почему так? Я ещё понимаю, когда сдвиг больше размера типа, но когда равно - должен же 0 быть?..

Добавлено:
Ну, трындец просто (взято отсюда):
QUOTE
most popular CPUs have only 5 bit shift counts
Офигеть!!!
И ещё (примерно оттуда же):
QUOTE
shift count from 0 up to the number of bits in the register-1
Слов нет - одни эмоции.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Grom PE
Jan 16 2010, 07:46
Сообщение #42


Advanced Member
***

Группа: CTPAX-X
Сообщений: 84
Регистрация: 7-February 08
Из: i@grompe.org.ru
Пользователь №: 3,120
Спасибо сказали: 95 раз(а)



-=CHE@TER=-

Ну дык, процессор так работает, x shr y на самом деле x shr (y mod 32).
Надо обнулить переменную, так и пиши =)

Точнее, x shr (y and 11111b), что и составляет 5 бит маски.
Intel


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jan 23 2010, 18:35
Сообщение #43


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



Думаю, что это лучше здесь разместить, чем в ссылках:
www.strchr.com - занятный сайт про C, WinAPI, ASM.
Примеры кода, оптимизации и времени которое будет затрачено на каждый вариант того или иного алгоритма. Есть исходные коды программ.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Siberian GRemlin
Feb 15 2010, 15:45
Сообщение #44


Advanced Member
***

Группа: CTPAX-X
Сообщений: 537
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Может не в тему, но есть ли готовый модуль\библиотека для работы с БД в SQLite?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Axsis
Feb 15 2010, 16:10
Сообщение #45


Advanced Member
***

Группа: CTPAX-X
Сообщений: 121
Регистрация: 6-February 08
Пользователь №: 374
Спасибо сказали: 149 раз(а)



пара ссылок с первой страницы гугла:
http://www.delphi.int.ru/articles/43/
http://sqlitebrowser.sourceforge.net/
http://sqlite4delphi.sourceforge.net/


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Apr 22 2010, 10:05
Сообщение #46


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



Чтобы долго не писать чего да как - приведу лог чата
QUOTE

******: можно тогда тебя отвлеч глупым вопросом?
-=CHE@TER=-: Давай.
******: есть девайс. типа ноут.
******: есть оборудование - типа жпс приёмник.
******: оно типа встроено и его не видно
******: покуда не будет запущена утилита и не поставлена галочка
******: вопрос
-=CHE@TER=-: Даже Everest не видит? А в BIOS девайс этот включён?
-=CHE@TER=-: А, понял.
******: можно ли как то отследить что делает эта утилита
******: тоесть покуда она не занесёт какой то битик в памяти - девайс не виден даже в эвересте
-=CHE@TER=-: Теоретически возможно всё.
******: а помню на двк была прога... типа оболочки
-=CHE@TER=-: А после закрытия утилиты и выгрузки её из памяти - девайс продолжает работать?
******: и можно было пошагово отслеживать выполнение программы
******: да. продолжает
******: если утилиту запустить повторно - то девайс исчезает :)
-=CHE@TER=-: Возможно она свой драйвер ставит, который после перезагрузки отваливается (так и задумано).
******: неее
******: драйверами не пахнет 100%
-=CHE@TER=-: Дай мне эту тулзу.
-=CHE@TER=-: И скажи чего ты там и где ставишь.
******: ща
******: я кинул
******: жпс активатор написал не знаю кто
******: изначально и этого даж не было
******: DEVICE_SWITCH.EXE поидеи запускается жпс активатором, автоматом передвигает курсор и жмёт применить
******: Enable gsc3f GPS
-=CHE@TER=-: Прикол.
-=CHE@TER=-: Оно у меня не запускается.
******: угу, вначале проверяет есть ли оборудование?
-=CHE@TER=-: Видимо, да.
-=CHE@TER=-: Т.е. оно запускается и тут же выходит.
-=CHE@TER=-: Даже ничего не сообщает.
******: поидеи папка тулс должна находиться в корне диска ц
-=CHE@TER=-: А какая разница?
******: покрайней мере когда она там... мне сообщает на обычном компе что девайс не может быть выключен
-=CHE@TER=-: У-у-у... Оно тут через DeviceIoControl работает...
******: переведи на земной язык :)
-=CHE@TER=-: Это проще будет документацию по устройству найти и написать свою программу, чем разбираться в исходном коде.
-=CHE@TER=-: Тут сильно замороченный алгоритм её включения / выключения.
-=CHE@TER=-: Нужна спецификация: в какой порт чего пихать, что должно прийти, что означает и т.д.
-=CHE@TER=-: http://mikhail.krivyy.com/2004/07/28/asus-l3c-led/
-=CHE@TER=-: Вот например - человек включает и выключает лампочку светодиода.
-=CHE@TER=-: Нужно тоже самое, но для твоего GPS.
-=CHE@TER=-: Ща тогда тебе ломанный файл дам - просто сграблю значения.
-=CHE@TER=-: Лови.
-=CHE@TER=-: Скопируй к себе на ноут и запусти, затем дай содержимое файла KERNEL.LOG, который появится.
-=CHE@TER=-: После запуска нажми, чтобы оно разрешило твоё устройство.
******: угу
******: готово
DeviceIoControl(232,2237444,INBUFF:1 1381453892 0 0 0 ,20,OUTBUFF768,)
DeviceIoControl(232,2237444,INBUFF:2 1447380049 1 8 1237008 ,20,OUTBUFF768,)
CBFARR(0 4 2)
DeviceIoControl(232,2237444,INBUFF:2 1313817683 1 8 1240192 ,20,OUTBUFF768,)
CBFARR(0 4 2)
DeviceIoControl(232,2237444,INBUFF:1 1381453892 0 0 0 ,20,OUTBUFF768,)
DeviceIoControl(232,2237444,INBUFF:2 1447380049 1 8 1237008 ,20,OUTBUFF768,)
CBFARR(0 4 2)
DeviceIoControl(232,2237444,INBUFF:2 1179599955 1 8 1240192 ,20,OUTBUFF768,)
CBFARR(0 4 2)
-=CHE@TER=-: Я сделал прогу.
******: что где тестить*?
-=CHE@TER=-: Лови gsc3fgps.exe
-=CHE@TER=-: Если просто запустишь - то включит, если с каким-либо параметром (любым) - то выключит.
******: ура! работает :)
-=CHE@TER=-: Сунь тогда прогу в автозагрузку - будет сразу при включении компьютера подключать твой GPS.


Код программы:
CODE
program gsc3fgps;
{$IFNDEF DCC32HACK}uses Windows;{$ENDIF}
// http://mikhail.krivyy.com/2004/07/28/asus-l3c-led/
// http://mikhail.krivyy.com/wp/wp-content/uploads/2006/10/asusled.cpp
// http://www.scintilla.utwente.nl/~timl/devicepower/v1.1/devicepower.c

const
  ATKACPI_IOCTL_CODE = $222404;
  // ioctl command codes
  DPWR = $52575044; // Device Power list
  QDEV = $56454451; // Query Device
  SDON = $4E4F4453; // Set Device On
  SDOF = $464F4453; // Set Device Off

type
  ioctl_arg = packed record
        dummy: word;
    arg_bytes: word;
        value: longword;
  end;
  pioctl_arg = ^ioctl_arg;

  ioctl_cmd = packed record
        ctype: longword;
     cmd_code: longword;
      has_arg: longword;
    arg_bytes: longword;
          arg: pioctl_arg;
  end;

function CtrlACPI(ATKACPIhandle: THandle; code, hasArg, arg: longword): longbool;
var
  iarg: ioctl_arg;
  icmd: ioctl_cmd;
  bout: longword;
  buff: array[0..191] of longword;
begin
  bout := 0;

  iarg.dummy := 0;
  iarg.arg_bytes := 4;
  iarg.value := 2;

  icmd.ctype := hasArg;
  icmd.cmd_code := code;
  icmd.has_arg := arg;
  icmd.arg_bytes := 8 * arg;
  icmd.arg := pioctl_arg(longword(@iarg) * arg);

  result := DeviceIoControl(ATKACPIhandle, ATKACPI_IOCTL_CODE, @icmd, sizeof(icmd), @buff[0], sizeof(buff), bout, nil);
end;

// enable gsc3f GPS
var ATKACPIhandle: THandle;
begin
  ATKACPIhandle := CreateFile('\\.\ATKACPI', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
  if ATKACPIhandle <> INVALID_HANDLE_VALUE then
  begin
    CtrlACPI(ATKACPIhandle, DPWR, 1, 0);
    CtrlACPI(ATKACPIhandle, QDEV, 2, 1);
    if ParamCount <> 0 then
      CtrlACPI(ATKACPIhandle, SDOF, 2, 1)  // OFF
    else
      CtrlACPI(ATKACPIhandle, SDON, 2, 1); // ON
    CloseHandle(ATKACPIhandle);
  end;
end.


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jun 1 2010, 17:46
Сообщение #47


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



Иногда бывает надо при распаковке игровых архивов попутно создавать необходимые каталоги.
Например для файла: DATA\TEXTURES\ENVIRONMENT\SKY_01.TGA их нужно создать аж 3 штуки.

Вот небольшие куски кода на Delphi и C для таких вещей.
Обрабатываются обе косые черты.
В обоих случаях идентификатор S не должен являться константой.

CODE
For I:=1 To Length(S) Do
  If ((S[I] = '\') Or (S[I] = '/')) Then
  Begin
    CreateDirectory(PChar(Copy(S, 1, I - 1)), Nil);
    { Delphi понимает только слэш }
    S[I]:='\';
  End;


CODE
char *s;
...
s = filenamepath;
while(*s){
  if((*s == '\\') || (*s == '/')){
    *s = 0;
    mkdir(filenamepath);
    /* а C понимает только такой */
    *s = '/';
  }
  s++;
}


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jul 21 2010, 16:00
Сообщение #48


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



QUOTE(-=CHE@TER=- @ Jul 20 2007, 13:48) *
Xplorer!
RasGetConnectionStatistics - это как раз в точности то, что мне нужно было!
Большое, нет просто ГРОМАДНОЕ спасибо!

Опять всплыл вопрос, только на этот раз хочу получить количество принятых / переданных байт для сетевой карты. RasGetConnectionStatistics() тут уже не помогает.

Сделал программу через GetIfTable, но, почему-то, если не сильно активен, там обычно на полмегабайта меньше трафика, чем отображается по команде "netstat -e". Кто-нибудь знает, в чём прикол?

Добавлено:
А! Всё, понял - "netstat -e" показывает суммарный трафик на адаптере - т.е. сколько пришло и ушло со всех интерфейсов. А т.к. интерфейса два (+loopback), то нужно было тупо трафик суммировать.
Хотя это даже удобно - если не учитывать loopback, то можно получить "чистый трафик", который уходит во внешку.


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jul 27 2010, 17:38
Сообщение #49


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



Блин, ставил по работе на удалённый сайт Joomla - застрелиться. Сама CMS в архиве .tar.gz, но хостер (сюрприз!) не даёт доступ по SSH, а также запускать через PHP exec() / system() чтобы выполнить команду распаковки. В Интернете погуглил - ничего кроме использования двух упомянутых выше команд посоветовать не могут.
Короче, распаковал я Жумлу и стал копировать по FTP на сайт... 2 часа с гаком - un-freaking-believable!
Скорость заливки-то большая, да вот при создании нового файла удалённый сайт почему-то тупил по несколько секунд, а в Жумле этих файлов, как снега зимой.
В общем, в конце копирования я уже озверел и решил написать свою программу, которая бы соединяла файлы в один (один файл быстро заливается) и чтобы этот файл можно было потом на сервере распаковать вызвав через HTTP скрипт на PHP для распаковки.

Формат файла filedump:
DWORD - размер файла (size)
DWORD - размер строки имени файла (nlen)
CHARS - имя и путь файла (nlen байт)
BYTES - содержимое файл (size байт)
Повторить до конца файла.

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

Опционально в эти скрипты можно добавить сжатие gz (если хостер поддерживает) и дату со временем.

pack.php - пакует в архив filedump всё в текущем каталоге и его подкаталогах.
unpk.php - распаковывает filedump в текущий каталог.

Т.к. скрипты дописал практически одновременно с окончанием копирования - проверить времени не было, но, по идее, должны работать. Кстати, там с правами под иксы может быть косяк - все файлы будут пользователю Apache принадлежать - это можно поковырять и chmod() при распаковке добавить для файлов.

Код программ

pack.php
CODE

<?php
  set_time_limit(0);

Function GetFileList($dirpath){
  $dirs = array();
  if(is_dir($dirpath)){
    if($dh = opendir($dirpath)){
      while($file = @readdir($dh)){
        if(($file != '.') && ($file != '..')){
          if((filetype($dirpath.$file) == 'file')){
            $dirs[] = $dirpath.$file;
          }else{
            $dirs[] = $dirpath.$file.'/';
            $dirs = array_merge($dirs, GetFileList($dirpath.$file.'/'));
          }
        }
      }
      closedir($dh);
      natcasesort($dirs);
    }
  }
  return($dirs);
}

//  optional: add filedatetime and compression
//  $tm = filemtime($file); // getfiletime
//  touch($file, $tm);      // setfiletime
//  $file = gzcompress($file, 9);
//  $file = gzdecompress($file);

  @unlink('./filedump');
  $list = GetFileList('./');
  for($i = 0; $i < count($list); $i++){
//    echo $list[$i]."\r\n";
    $fl = fopen('./filedump', 'ab');
    if($fl){
      $name = substr($list[$i], 2);
      $nlen = strlen($name);
      $size = 0;
      $file = '';
      if($name[$nlen-1] != '/'){
        $size = filesize('./'.$name);
        $file = file_get_contents('./'.$name);
      }
      $size = pack('V', $size);
      $nlen = pack('V', $nlen);
      fwrite($fl, $size, 4);
      fwrite($fl, $nlen, 4);
      $size = unpack('V', $size);
      $nlen = unpack('V', $nlen);
      fwrite($fl, $name, $nlen[1]);
      fwrite($fl, $file, $size[1]);
    }
    fclose($fl);
  }

?>




unpk.php
CODE

<?php
  set_time_limit(0);
  $fend = filesize('./filedump');
  $fl = fopen('./filedump', 'rb');
  while(ftell($fl) < $fend){
    $size = 0;
    $nlen = 0;
    $name = '';
    $file = '';

    $size = fread($fl, 4);
    $nlen = fread($fl, 4);
    $size = unpack('V', $size);
    $nlen = unpack('V', $nlen);
    $size = $size[1];
    $nlen = $nlen[1];
    $name = fread($fl, $nlen);
    if($size != 0){
      $file = fread($fl, $size);
    }
    if($name[$nlen-1] == '/'){
      @mkdir('./'.$name, 0777);
    }else{
      @file_put_contents('./'.$name, $file);
    }
  }
  fclose($fl);
?>



Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Aug 10 2010, 14:27
Сообщение #50


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



Вчерась ковырял одну игрушку, где данные были упакованы deflate. Как и всегда использовал puff.c + puff.h из zlib. Внезапно, при распаковке, получаю ошибку записи в память по адресу 0, программа падает. Почесав затылок извлекаю сжатый файл отдельно и делаю тестовую программку, где ничего кроме распаковки нет - не помогло. Тогда беру предыдущую (благо сохранилась - я, кстати, понял что после выхода новой версии программы, старые лучше не удалять - можно потом будет об этом сильно пожалеть) и компилирую с ней - всё работает! Написал письмо в zlib - мне товарищ Mark Adler выслал сегодня патч - применил его на последнюю версию и всё снова заработало.
Т.к. этот баг появляется редко (я уже пару программ с последней версией puff сделал и упало только здесь и то на 1 файле), то, скорее всего, обновлять файлы на сайте zlib.net будут не скоро. К тому же это не основной пакет, а дополнительный. Так что привожу инструкцию по самостоятельному патчу файла "puff.c" version 2.1, 4 Apr 2010:

1) Скачиваем Binaries Zip, распаковываем и ищем там файл "patch.exe".
2) Кидаем к нему в каталог файл "puff.c", который мы хотим пропатчить.
3) Создаём в том же каталоге текстовый файл "puff.diff" такого содержания:
CODE

--- ../../../zlib-1.2.5/contrib/puff/puff.c     2010-04-04 11:23:58.000000000 -0700
+++ puff.c      2010-04-25 02:04:16.000000000 -0700
@@ -525,6 +544,12 @@
         int symbol;
         short lengths[FIXLCODES];

+        /* construct lencode and distcode */
+        lencode.count = lencnt;
+        lencode.symbol = lensym;
+        distcode.count = distcnt;
+        distcode.symbol = distsym;
+
         /* literal/length table */
         for (symbol = 0; symbol < 144; symbol++)
             lengths[symbol] = 8;
@@ -541,12 +566,6 @@
             lengths[symbol] = 5;
         construct(&distcode, lengths, MAXDCODES);

-        /* construct lencode and distcode */
-        lencode.count = lencnt;
-        lencode.symbol = lensym;
-        distcode.count = distcnt;
-        distcode.symbol = distsym;
-
         /* do this just once */
         virgin = 0;
     }

4) Запускаем:
patch.exe -o puff2.c puff.c puff.diff
5) Получаем исправленный файл в "puff2.c".
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Siberian GRemlin
Jan 7 2011, 15:20
Сообщение #51


Advanced Member
***

Группа: CTPAX-X
Сообщений: 537
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Сегодня у меня был очередной сеанс мозгофилии.
Пример из InnoSetup (описание внешней процедуры в IS)
CODE
procedure MyDllFuncSetup(hWnd: Integer; lpText, lpCaption: AnsiString; uType: Cardinal);
external 'MyDllFunc@files:MyDll.dll stdcall';

Пример из InnoSetup (описание процедуры в Delphi)
CODE
procedure MyDllFunc(hWnd: Integer; lpText, lpCaption: PAnsiChar; uType: Cardinal); stdcall;
begin
  MessageBoxA(hWnd, lpText, lpCaption, uType);
end;

Меня удивила разница в типе параметров - строка и явный указатель. Проверил, работает. И действительно, на стороне DLL получаем не строку, а указатель.

Далее самое главное, на стороне своей DLL я работаю с интерфейсом из другой DLL и его параметры изменить не могу, а там используется указатель на другой тип.
CODE
Reader.Open(PWideChar(FileName));
где FileName: String;
Если работать с диалогами и брать строку (имя файла) оттуда, то всё работает. В моём же случае пришлось извратиться.
CODE
S:='';
for j:=0 to Length(FileName)-1 do S:=S+FileName[j];
Reader.Open(PWideChar(S));

Но это не помогло, и в итоге получаем, что якобы "нет такого файла". А также получил предупреждение (было ли оно в оригинале уже не помню)
QUOTE
suspicious typecast of string to pwidechar
Пробовал искать в сети инфу, но либо не так запросы оформляю, либо ничего дельного там нет. Как это дело правильно преобразовать?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jan 7 2011, 23:20
Сообщение #52


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



1) Либо Inno: AnsiString -> WideString; Delphi: PAnsiChar -> PWideChar
2) Либо MultiByteToWideChar в Delphi
Первый вариант предпочтительнее, т.к. не будет зависеть от установленной в системе локали.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Siberian GRemlin
Jan 8 2011, 10:49
Сообщение #53


Advanced Member
***

Группа: CTPAX-X
Сообщений: 537
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Собственно, я и спрашивал как правильно перегнать PAnsiChar -> PWideChar.

Добавлено:
Сделал пока так. Насчёт локалей в системе ничего не понял. Это что такое? Желательно писать или по-русски или по-английски, чтобы понять можно было, ибо винегрет плохо усваивается организмом.
CODE
//Обычную в юникод
function StringToWideString(const s: AnsiString; codePage: Word=0): WideString;
var
  l: integer;
begin
  if s = '' then
    Result := ''
  else
  begin
    l := MultiByteToWideChar(codePage, MB_PRECOMPOSED, PChar(@s[1]), - 1, nil, 0);
    SetLength(Result, l - 1);
    if l > 1 then
      MultiByteToWideChar(CodePage, MB_PRECOMPOSED, PChar(@s[1]),
        - 1, PWideChar(@Result[1]), l - 1);
  end;
end;
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jan 8 2011, 12:35
Сообщение #54


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



Locale - это, грубо так говоря, язык установленный в системе (их, кстати, может быть сколько угодно, а не только 1 (EN) или 2 (EN, RU)). Например, если поставить чистую английскую винду, то вместо русских букв у тебя будут только знаки "?" (как и вместо букв любого другого не-английского языка).
Я не знаю (настолько серьёзно с Inno не работал) поддерживает ли он UNICODE, но без этого:
1) "C:\Игры\UT" превратится в "C:\????\UT" если в системе не установлена русская локаль.
2) Любой каталог, где в имени есть символы непредставимые в ANSI, будет содержать в имени "?".
Что, естественно, работать в ANSI-программе не будет.
ANSI -> UNICODE не проблема, а вот при UNICODE -> ANSI часть символов теряется (превращается в "?"). Поэтому я и написал, что лучше только с Unicode работать, если уж даже твоя библиотека её требует.
Вообще, конечно, можно на этом не запариваться - вряд ли твой руссификатор какие-нибудь китайцы ставить будут. Главное, чтобы всяких хитрых символов в имени каталога назначения не было (и в имени пользователя тоже, если ты используешь временный каталог по умолчанию, а он "C:\Documents and Settings\ВасяПупкин\Local Settings\Temp\" - мы так, если помнишь, с первой версией NFSMultiConv пролетели, т.к. утилита VAG'а работала только с ANSI именами файлов).
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jan 9 2011, 16:01
Сообщение #55


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



Ковырял тут по просьбе CMS одну. Собственно, были проблемы с отображением.

Во-первых, баннер в шапке как-то странно отваливался вниз. Причём только под IE8, под всеми остальными обозревателями, в том числе под IE6 всё было ок. Ну да не беда - всё поправилось добавлением свойства valign="top" в тег <td> где был баннер:
CODE
<td valign="top"><a href="http://www.example.com/"><img src="banner.jpg"></a></td>


Во-вторых, почему-то у таблиц с меню и прочими вещами последняя строка с картинкой линии имеющей закруглённые края по бокам всё время на 3-4 пикселя отваливалась от таблицы. Такое убожество было только под IE (версии 6 или выше). Собственно, код последней строки:
CODE
<tr><td colspan="2"><img src="bottom.gif" border="0" height="5" width="200"></td></tr>

Установка border у <td> и <img> показала, что зазор именно между ними. Т.е. получалось что это либо padding у <td>, либо margin у <img>. Однако установка всех возможных атрибутов: border, margin, padding у обоих этих элементов в 0 и даже несмотря на добавление !important зазор так и не убрала. Офигев от такого я поставил у <td> стиль background-image и background-repeat: no-repeat, а внутрь <td> всунул nbsp чтобы пустая таблица не схлопывалась, что, собственно, решило проблему. Но мне решение не понравилось и я решил ещё поковырять стили, тем более, что такой глюк с разметкой я часто видел и на других сайтах. Чтобы я не делал (даже valign="top" у <td>), какие бы стили не менял зазор всё равно оставался. И тут я подумал: отступ, должно быть, делает сам IE, т.к. сайт написан на xml, но некоторые элементы там не соответствуют стандарту (как видно у той же картинки в шаблоне нет "/" на конце - должно быть <img ... />). Я где-то читал, что если документ не соответствует строго формату xml, то во время парсинга IE переключается обратно в какой-то там режим совместимости чего-то с чем-то. И в нём он может отображать элементы как попало. Мне нужно было как-то вытащить элемент из того неизменяемого контейнера, который ему сделал IE. Можно было применить абсолютное позиционирование, но такой фокус это уж очень грязный хак, да и с изменяемым по ширине/высоте контентом не пройдёт. И тут меня осенило - я добавил у тега <img> свойство:
CODE
style="float:left;"

И всё заработало! Ведь float как раз отменяет всякие там отступы и прочие вещи, что в данном случае решило проблему.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Siberian GRemlin
Apr 14 2011, 16:49
Сообщение #56


Advanced Member
***

Группа: CTPAX-X
Сообщений: 537
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Не подскажите ка можно на JavaScript вставить (гипер)текст в страничку из внешнего файла? Что-то типа include() на PHP.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Apr 14 2011, 18:26
Сообщение #57


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



Если тебе просто что-то надо вставить, а не файл, то можно так:
CODE
var st = '<a href="http://www.google.com/">Google</a>';
var test = document.getElementById("test");
test.innerHTML = st; // содержимое элемента с id="test" будет заменено на то, что было в переменной st


Если же тебе именно файл надо загрузить, то тут смотри в сторону AJAX или jQuery. Кстати, загружать что-то на JavaScript можно только с того же домена, где выполняется скрипт. Иначе политика безопасности не позволит. Т.е. JavaScript выполняемый на сайте example.com не сможет загрузить что-либо с сайта microsoft.com.

Для XML (для HTML там надо, видимо, XML убрать) на java script:
CODE
var st = './testfile.xml';
var http_request = false;
http_request = new XMLHttpRequest();
if(!http_request){
  alert('XMLHTTPERROR');
  return;
}
http_request.open("GET", st, false);
http_request.send(null);
st = http_request.responseText; // ответ сервера - XML документ


На jQuery всё вообще в одну строчку (данный пример загружает в div с id="test" содержимое файла newpage.htm с сервера):
CODE
$('#test').load('./newpage.htm');

Если #test заменить на body - то будет заменено содержимое страницы.

Кстати, include() в PHP используется для подключения файлов с исходными кодами. Упаси тебя боже использовать его для вывода страницы, особенно, если это не твой файл, а, скажем, скачанные данные из Интернета - вредоносный PHP код туда всунуть как два байта переслать.
Насчёт же подключения в HTML я бы frame или iframe посоветовал, но их баннерорезки часто рубят.


Спасибо сказали:
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Siberian GRemlin
Apr 15 2011, 11:12
Сообщение #58


Advanced Member
***

Группа: CTPAX-X
Сообщений: 537
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Мне нужно было именно на JS или jQ, ибо для AJAX нужен TomCat, а его на сервере нет, равно как и нет PHP. В сети почему-то нужную функцию найти не мог никак. Спасибо!
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jul 23 2011, 13:01
Сообщение #59


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



Поставил я тут новый colorer для FAR и моя тачка захлебнулась обрабатывая те PHP скрипты, которые раньше без проблем редактировались. Так что откатился я на colorer version 'freeCraze' за 08.03.2000.
Работает резко, но там косяки были с раскраской у PHP - пришлось вручную дожимать до рабочего состояния.

Итак:
1) В файле:
C:\Program Files\Far\Plugins\colorer\includes\net\PHP.Hrc
находим строчку:
CODE
<Block Start="/(\<\?)/" End="/(\?\>)/" Scheme="PhpScript"
Color0="PhpText" Color1="HtTag" Color2="HtTag">

меняем на:
CODE
<Block Start="/(\<\?(php)*)/" End="/(\?\>)/" Scheme="PhpScript"
Color0="LtCyan/bkBlack" Color1="HtTag" Color2="HtTag">


2) В файле:
C:\Program Files\Far\Plugins\colorer\includes\net\PhpScript.Hrc

- исправляем статичные строки (с одиночными кавычками):
находим строчку:
CODE
<RegExp Start="/([Ll]?'..??.??.??')/" Color0="dStrings">

меняем на:
CODE
<RegExp Start="/('(.*?[^\'])??')/" Color0="dStrings">


- исправляем проверку регистра у ключевых слов (чтобы подсвечивались в любом варианте):
находим строчку:
CODE
<KeyWords MatchCase="True" Color="dResWords">

меняем на:
CODE
<KeyWords MatchCase="False" Color="dResWords">


- подсвечиваем переменные - добавляем куда-нибудь вот такое:
CODE
<!-- Varibles -->
<RegExp Start="/(\$[a-zA-Z0-9_]+)/" Color0="DkGray">


После всех этих изменений новый colorer уже и не нужен. (*улыбается*)
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Siberian GRemlin
Jul 28 2011, 03:05
Сообщение #60


Advanced Member
***

Группа: CTPAX-X
Сообщений: 537
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Намедни столкнулся с тем что IE не понимает InnerHTML (и некоторые другие) для таблиц. Поискав, нашёл решение. Читать можно только последний абзац с кодом.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

9 Страниц V < 1 2 3 4 5 > » 
Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0 -

 



Упрощённая версия Сейчас: 18th November 2024 - 18:37