Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

Открыть новую тему     Написать ответ в эту тему

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 5

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).


 
Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].


    Некоторые "родственные" топики:
     
  • Вопросы по Delphi (версии 2009-2010 Weaver)
  • Вопросы по компонентам для Delphi, C++ Builder
  • Использование DevExpress
  • Вопросы по Ehlib
  • Компоненты и утилиты для Delphi/BCB/FreePascal/Lazarus - только Open Source
  • Коммерческие компоненты и утилиты для Delphi/BCB
  • кабак программистов :)
     
    См. также: Некоторые полезные ресурсы о Delphi
     
    И старайтесь, чтобы ваш код не попал сюда :)

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 05:13 19-05-2010 | Исправлено: akaGM, 02:33 15-07-2020
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    R3Pa4eK
    TFileSteam
    LoadFromFile
    LoadFromStream

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 10:14 11-07-2011
    R3Pa4eK



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    ShIvADeSt

    Цитата:
    TFileSteam  

    Может TFileStream? Если да, то я в нем нет функций LoadFromFile и LoadFromStream.
     
    Добавлено:
    ShIvADeSt
    Смотри, имеется файл, например image.png. Мне надо его экспортировать в поток и брать этот файл с него! Маленькая наработка

    Всего записей: 963 | Зарегистр. 15-01-2011 | Отправлено: 10:25 11-07-2011
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

    Цитата:
    Может TFileStream?

    Упс, TMemoryStream.  
    У него есть LoadFromFile. A LoadFromStream - это уже к тому компоненту, который должен работать с потоком.
    Сразу говорю - я не знаю как будет себя вести поток при вызове и передаче в библиотеку.

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 10:52 11-07-2011
    R3Pa4eK



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    ShIvADeSt
    А как загрузить определённый файл с потока?

    Всего записей: 963 | Зарегистр. 15-01-2011 | Отправлено: 11:08 11-07-2011
    egerLESHIK



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Здравствуйте, уважаемые.
    Не могли бы помочь с решением одного вопроса.
     
    Пытаюсь динамически загружать данные из файла Excel.  
    загружаю их в cxGrid1 через связку ADOConnection1+ADODataSet1+ADOQuery1+DataSource1,
     
    затем путем построчного обхода строк по колонкам пытаюсь записать значения в создаваемую автоматом таблицу (таблица в бд Firebird создается без проблем).
     
    Записать данные пытаюсь через SQL-запрос, использую связку pFIBDatabase1+pFIBDataSet1+pFIBTransaction1+pFIBQuery1+DataSource2, с последующим отображением в cxGrid2.
     
    Часть кода программы, отвечающую за эту операцию привожу ниже:
     

    Цитата:
    With CNN_complex.Form1 do
      begin
      cxGrid2.Visible:=false;
      cxGrid1.Visible:=true;
     while k<=cxGrid1DBTableView1.DataController.RecordCount-1 do
      begin
      for i := 0 to cxGrid1DBTableView1.DataController.ItemCount-1 do
      begin
        pFIBQuery1.Close;
        pFIBQuery1.Params.ParamByName(namecol).Value:=ADOQuery1.Fields[i].AsAnsiString;
        pFIBQuery1.SQL.Text:='INSERT INTO KONTRA'+dft+' '+ADOQuery1.Fields[i].FieldName+'values :namecol';
        pFIBQuery1.ExecQuery;
        pFIBTransaction1.CommitRetaining;
     end;
        ADOQuery1.Next;
        k:=k+1;
      end;
      end;

       
    При компиляции и запуска операции по выполнению данного блока кода получаю следующую ошибку: Parameter "" does not exist in Form1.pFIBQuery1.
     
    Быть может кто-то знает более простой путь занесения динамических данных из Excel файла в Firebird. Подскажите, пожалуйста.
     
    Спасибо, за внимание.
     

    Всего записей: 950 | Зарегистр. 24-03-2004 | Отправлено: 13:44 11-07-2011
    extasy



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    R3Pa4eK
     
    Что-то такое
     

    Код:
    procedure TMainFrm.Button1Click(Sender: TObject);
    var
      ms: TMemoryStream;
    begin
      // создаем поток в памяти
      ms := TMemoryStream.Create;
      // загружаем в него файл
      ms.LoadFromFile('C:\11.bmp');
     
      // переходим к началу потока
      ms.Seek(0, soFromBeginning);
      // загружаем картинку из потока
      Image1.Picture.Bitmap.LoadFromStream(ms);
       
      // переходим к началу потока
      ms.Seek(0, soFromBeginning);
      // загружаем картинку из потока
      Image2.Picture.Bitmap.LoadFromStream(ms);
     
      // убираем за собой
      ms.Free;
    end;
     

     
     
     
     
    egerLESHIK
    1.

    Код:
    pFIBQuery1.Params.ParamByName(namecol).Value:=ADOQuery1.Fields[i].AsAnsiString;  

    скорее всего должно быть (обратите внимание на кавычки)

    Код:
    pFIBQuery1.Params.ParamByName('namecol').Value:=ADOQuery1.Fields[i].AsAnsiString;  

     
    2.

    Код:
    'INSERT INTO KONTRA'+dft+' '+ADOQuery1.Fields[i].FieldName+'values :namecol';

    Очень странная конструкция.
    Запрос приобретает такой вид:

    Код:
    INSERT INTO KONTRAlalala field_namevalues value

    А должно что-то такое:

    Код:
    INSERT INTO KONTRAlalala (field_name) values (value)

     
    3.
    Пусть у вас грид такой

    Код:
    Field1    Field2    Field3    Field4
    --------------------------------------
    aa1       aa2       aa3        aa4
    bb1       bb2       bb3        bb4
     

     
    Тогда в результате вы получите таблицу:

    Код:
    Field1    Field2    Field3    Field4
    --------------------------------------
    aa1       ---        ---           ---
    ---        aa2       ---           ----
    ---       ----         aa3        ----  
    ----     ----        ----           aa4
    bb1       ---        ---           ---
    ---        bb2       ---           ----
    ---       ----         bb3        ----  
    ----     ----        ----           bb4
     


    Всего записей: 429 | Зарегистр. 18-05-2006 | Отправлено: 14:23 11-07-2011 | Исправлено: extasy, 14:38 11-07-2011
    Czechoslovak



    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    egerLESHIK
    По ходу надо с начало присвоить SQL запрос и определить тип , а потом устанавливать параметр.

    Всего записей: 175 | Зарегистр. 27-06-2007 | Отправлено: 16:02 11-07-2011
    egerLESHIK



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Что-то изменил код, как советовал extasy теперь вместо параметра "" высвечивается параметр названия поля, но ошибку все равно выдает: Parameter "здесь название поля" does not exist in Form1.pFIBQuery1.  
     
    P.S. Колонка с таким названием в базе данных есть.
     

    Всего записей: 950 | Зарегистр. 24-03-2004 | Отправлено: 21:37 11-07-2011
    extasy



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    egerLESHIK
    Незнаю какой компонент вы используете, но в UniDac и  MySQL вначале параметр еще нужно создать
     
    Что-то такое:

    Код:
      query.Params.CreateParam(ftBlob,'p_data',ptInput);
      query.ParamByName('p_data').LoadFromFile(MainFrm.OpenDialog1.FileName, ftBlob);
     

    Всего записей: 429 | Зарегистр. 18-05-2006 | Отправлено: 10:22 12-07-2011
    krapotkin

    Junior Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    R3Pa4eK
    сама идея непонятна
    что значит "файл с потока" ??
    В чем задача, объясни по-человечьи.
     
    поток - TStream
    работа с файлом как с потоком - TFileStream ( class(TStream) )
    работа с данными в памяти как с потоком - TMemoryStream
    есть еще разные готовые классы
     
    все они свободно читают друг из друга...
     
    например если создать TFileStream и читать из него, файл будет читаться пока не закончится:
     

    Код:
    memStream1.CopyFrom(fileStream1, fileStream1.Size)  

     
    memStream1 зачитает все содержимое файла, подключенного к fileStream1, к себе в буфер.

    Всего записей: 69 | Зарегистр. 10-01-2006 | Отправлено: 14:02 12-07-2011 | Исправлено: krapotkin, 14:04 12-07-2011
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    extasy
    Поставил FastMM. Все равно толком не понял где утечки. Там есть какие-то цифры в сообщении после возникновения ошибки, если соотнести к строкам кода, то это действия с SetLength.
     
    Переделал так, вроде не валится код, но не докачивает страницу. Работает на мелких файлах. Большой недогружает где-то 20%.
     
    Код
     
    Где ошибка не пойму ведь вроде все корректно. Можно конечно задать фиксированный Array of AnsiChar и перед InternetReadFile занулять его, да ну в задницу такой подход.

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 23:39 12-07-2011
    extasy



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    Возможно следует изменить

    Код:
        bRet := InternetQueryDataAvailable(hResourceHandle, dwBytesToWrite, 0, 0);
          if (bRet and (dwBytesToWrite > 0)) then  

    на что-то такое

    Код:
    while (InternetQueryDataAvailable(hResourceHandle, dwBytesToWrite, 0, 0)) do  

     
     
    А насчет утечки при SetLength, то имхо проблема в том, что затирается нулевой символ в строке, где указывается ее длина. Но это умозрительно, если интересно - проверьте в дебагере Сам я так никогда над строкой не извращался, проще с Array of Byte работать в таких случаях.

    Всего записей: 429 | Зарегистр. 18-05-2006 | Отправлено: 07:26 13-07-2011 | Исправлено: extasy, 07:40 13-07-2011
    Maks150988



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    extasy
    Я не умею с дебагером обращаться. Максимум для чего использую так это для запуска откомпилированного приложения. Подскажите тогда способ работы с Array of Byte. Я сделал так.
     

    Код:
    type
      TByteArr = Array of Byte;
     
    function BytesToStr(Buf: TByteArr): AnsiString;
    var
      I: Integer;
    begin
      Result := '';
      for I := 0 to Pred(Length(Buf)) do
      begin
        if (Buf[I] <> $00) then
          Result := Result + Chr(Buf[I]);
      end;
    end;
     
    function SendSoapRequest(hResourceHandle: HINTERNET; pszSoap: Utf8String): AnsiString;
    var
      dwStatus      : DWORD;
      dwStatusSize  : DWORD;
      dwReserved    : DWORD;
      bRet          : Boolean;
      pszText       : Utf8String;
      dwBytesToWrite: DWORD;
      dwBytesRead   : DWORD;
      pByteData     : TByteArr;
    begin
      Result := '';
      bRet := HttpSendRequest(hResourceHandle, nil, 0, LPTSTR(pszSoap), lstrlen(LPTSTR(pszSoap)));
      if bRet then
      begin
        dwStatus := 0;
        dwStatusSize := SizeOf(dwStatus);
        dwReserved := 0;
        bRet := HttpQueryInfo(
          hResourceHandle,
          HTTP_QUERY_FLAG_NUMBER or HTTP_QUERY_STATUS_CODE,
          @dwStatus,
          dwStatusSize,
          dwReserved
        );
        if (bRet and (dwStatus = HTTP_STATUS_OK)) then
        begin
          bRet := InternetQueryDataAvailable(hResourceHandle, dwBytesToWrite, 0, 0);
          if (bRet and (dwBytesToWrite > 0)) then
          begin
            SetLength(pByteData, dwBytesToWrite);
            repeat
              ZeroMemory(pByteData, Length(pByteData));
              bRet := InternetReadFile(hResourceHandle, Pointer(pByteData), dwBytesToWrite, dwBytesRead);
              if (bRet and (dwBytesRead > 0)) then
              begin
                pszText := Utf8ToAnsi(BytesToStr(pByteData));
                Result := Result + pszText;
              end;
            until
              dwBytesRead = 0;
          end;
        end;
      end;
    end;

     
    Такая же хрень что и с GetMem, зато хоть не вылетает. Может ограничение буфера какое-то?

    Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 00:01 14-07-2011
    extasy



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Maks150988
    Для преобразования в строку уже есть функция StrPas. Или даже проще: "To convert a null terminated string to an AnsiString or native Delphi language string, use a typecast or an assignment."
    _http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/SysUtils_StrPas@PAnsiChar.html
    Но для этого лучше выделять память на 1 байт больше, чем требуется для чтения, чтобы в этом последнем байте гарантированно был null (символ с кодом 0).
     
    И перед выходом из функции, явно очистите память за собой SetLength(pByteData, 0);
     
    А насчет того, что не весь _большой_ файл скачивается, то вы явно не обратили внимание на замену

    Код:
        bRet := InternetQueryDataAvailable(hResourceHandle, dwBytesToWrite, 0, 0);
          if (bRet and (dwBytesToWrite > 0)) then  

    на что-то такое

    Код:
    while (InternetQueryDataAvailable(hResourceHandle, dwBytesToWrite, 0, 0)) do  

     
    Т.е. считывать данные пока есть что читать, потому что возможно разбиение их на несколько кусков. И не забудьте в этом случае переделать чтение. В смысле - раз читаем в цикле, то нужно считывать не в начало массива , а расширять его и читать в его конец. Хотя в вашем коде, скорее всего не надо будет с этим заморачиваться, вы все равно на каждой итерации будете дописывать Result.

    Всего записей: 429 | Зарегистр. 18-05-2006 | Отправлено: 08:23 14-07-2011 | Исправлено: extasy, 08:39 14-07-2011
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите, получает-ли приложение какие-нибудь сообщения, когда его убивают, допустим через диспетчер задач?
    (можно ли отловить сей момент?)

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 19:26 14-07-2011
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Aleksandr N
    Если используется TerminateProcess, то нет.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 20:53 14-07-2011
    Aleksandr N

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
    Жаль, известные мне методы убийства, в том числе "диспетчер задач" используют именно TerminateProcess.

    Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 21:24 14-07-2011
    ShIvADeSt



    Moderator
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins

    Цитата:
    Если используется TerminateProcess, то нет.

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

    ----------
    И создал Бог женщину... Существо получилось злобное, но забавное...

    Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 04:53 15-07-2011
    delover

    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Программка для нахождения прямоугольных форм в сканнере. Бесплатная. Отечественная.
    http://cc.embarcadero.com/Item/28352

    Всего записей: 1395 | Зарегистр. 25-06-2007 | Отправлено: 08:01 18-07-2011 | Исправлено: delover, 08:02 18-07-2011
    Gnom3



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Подскажите пожалуйста, как задать цвет окна через HWND?
    Смысл такой - есть вызываемая функция, которая обрабатывет окно именно через хендл, нужно внутри этой-же функции к тому-же окну задать цвет. Насколько это возможно?

    Всего записей: 864 | Зарегистр. 14-11-2010 | Отправлено: 19:34 20-07-2011
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 6


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru