Автор | Сообщение |
|
| |
Пост N: 2372
Зарегистрирован: 17.05.05
|
|
Отправлено: 21.05.12 16:52. Заголовок: Снова EXCEL (продолжение)
Ранее с Excel из Harbour ни когда не работал. Поставили тут задачу. У некоторых поставщиков есть определенные формы заказов. Набраны они в Excel. Сейчас народ руками заполняет эти формы и шлет по электронке поставщикам. Задача сводится к тому что бы в этих формах находить нужные коды товара и в нужной ячейке проставлять заказ. Может ткнет кто носом с чего начать что бы не напороться на грабли. Спасибо Сами формы тут http://zalil.ru/33279066
|
 |

|
Ответов - 202
, стр:
1
2
3
4
5
6
7
8
9
10
11
All
[только новые]
|
|
|
| |
Пост N: 486
Зарегистрирован: 08.07.06
|
|
Отправлено: 05.01.16 00:41. Заголовок: Dima пишет: Что кас..
Dima пишет: цитата: | Что касаемо картинки ....проделывал уже такой эксперимент , результат выше описал. |
| Excel 2000 и 2010 при формате ДД.ММ.ГГ показывает все четко, год двумя цифрами. А вот если задать DD.MM.YY - любую дату преобразует в целое число (видно в строке формул вверху), а внутри ячейки пишет (дословно) "DD.MM.YY"
|
 |

|
|
| |
Пост N: 71
Зарегистрирован: 09.09.11
|
|
Отправлено: 13.01.16 15:55. Заголовок: Добрый день, коллеги..
Добрый день, коллеги. Программа на xHarbour, выгружаю файлы MS Excel, затем собираем в сводный отчет данные из выгруженных файлов MS Excel. Слетают настройки цветов и форматов в сводном отчете... Пробовал на разных версиях MS Excel, закономерности пока не нашел. Но на 1 ПК всегда выгружается без сбоев.Операционные системы на всех ПК - Win7, офис возможно разный... Что может быть в тонкостях настройки MS Excel? Всех со "Старым" Новым Годом!!!
|
 |

|
|
| |
Пост N: 3
Зарегистрирован: 04.04.16
|
|
Отправлено: 06.05.16 02:21. Заголовок: Help me pls. Длител..
Help me pls. Длительное время работает такая схема формирования отчета в Excel 1.Грузится xls-файл - образец с отформатированной шапкой (соответственно - нужные ширины столбцов) Чтобы не портить образец ( юзера всегда умудрятся его перезаписать) 2.Копируется лист 3.Создается новая книга. 4.Вставка в лист новой книги. 5.Добавление строк отчета в новую книгу oExcel:Workbooks:Open(cFile) oBook:=oExcel:ActiveWorkbook() oBook:Worksheets(1):Cells:Copy() oBookN:=oExcel:WorkBooks:Add() //новая пустая книга oSheet:=oBookN:Worksheets(1) oSheet:Paste() Вдруг с некоторых пор на одном рабочем месте перестали копироваться ширины столбцов. Пытался найти отличия в настройках Excel-я влияющие на режим копирования - не нашел. Второй вариант - принудительное копирование ширин столбцов. В макросе это выглядит так Cells.Select Selection.Copy Workbooks.Add ActiveSheet.Paste //вставка ширин столбцов Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, SkipBlanks:=False, Transpose:=False Как последнюю строку макроса переписать в терминах Харбора?
|
 |

|
|
| постоянный участник
|
Пост N: 1192
Зарегистрирован: 09.10.06
|
|
Отправлено: 06.05.16 06:47. Заголовок: Пробуйте так (не про..
Пробуйте так (не проверял) #define xlPasteColumnWidths 8 #define xlPasteSpecialOperationNone -4142 Paste := oExcel:ActiveSheet():PasteSpecial(xlPasteColumnWidths, xlPasteSpecialOperationNone, False, False)
|
 |

|
|
| |
Пост N: 4
Зарегистрирован: 04.04.16
|
|
Отправлено: 06.05.16 06:58. Заголовок: Error 1559948/3 DIS..
Error 1559948/3 DISP_E_MEMBERNOTFOUND: PASTESPECIAL похоже - не находит метод PASTESPECIAL P.S. без ошибок прошло oSheet:Cells:PasteSpecial(xlPasteColumnWidths, xlPasteSpecialOperationNone, .f., .F.)
|
 |

|
|
| постоянный участник
|
Пост N: 1193
Зарегистрирован: 09.10.06
|
|
Отправлено: 06.05.16 07:34. Заголовок: Sadstar2016 пишет: ..
Sadstar2016 пишет: цитата: | без ошибок прошло oSheet:Cells:PasteSpecial(xlPasteColumnWidths, xlPasteSpecialOperationNone, .f., .F.) |
| Ну да, поскольку PasteSpecial в Excel метод обьекта Range, Cells: там нужен oExcel:ActiveSheet():Cells:PasteSpecial Петр пишет: цитата: | Пробуйте так (не проверял) |
| Но вы не об этом и спрашивали Как я понял, суть вопроса - как преобразовать вызов метода, а не к чему этот метод применить
|
 |

|
|
| |
Пост N: 155
Зарегистрирован: 05.10.06
|
|
Отправлено: 13.05.16 16:11. Заголовок: Sadstar2016 пишет: ..
Sadstar2016 пишет: цитата: | 1.Грузится xls-файл - образец с отформатированной шапкой (соответственно - нужные ширины столбцов) Чтобы не портить образец ( юзера всегда умудрятся его перезаписать) |
| Может проще скопировать файл шаблона и работать с ним?
|
 |

|
|
| |
Пост N: 5
Зарегистрирован: 04.04.16
|
|
Отправлено: 16.05.16 01:53. Заголовок: IMHO - пусть юзер са..
IMHO - пусть юзер сам решает - где и под каким именем хранить файл - если его вообще нужно хранить
|
 |

|
|
| |
Пост N: 430
Зарегистрирован: 17.06.10
|
|
Отправлено: 19.05.16 12:56. Заголовок: Передача параметра в макрос
На листе Excel создаю кнопку oExc:Sheets(1):Buttons:Add(120, 20+30*(cnt-1), 350, 22) и указываю макрос, который должен выполниться при клике на этой кнопке oExc:Sheets(1):Buttons(cnt):OnAction:="Макрос1" А как можно сделать вызов этого макроса с параметром ?
|
 |

|
|
| |
Пост N: 431
Зарегистрирован: 17.06.10
|
|
Отправлено: 19.05.16 16:07. Заголовок: Параметр, видимо, пе..
Параметр, видимо, передать нельзя. Но можно использовать свойство кнопки Parameter, а в макросе поймать эту кнопку через Caller
|
 |

|
|
| |
Пост N: 148
Зарегистрирован: 10.07.07
|
|
Отправлено: 10.06.16 17:08. Заголовок: Как задать денежный формат ячейки?
Нужно из xHarboura при заполнении Excel-файла задать формат поля "Денежный". Офис 2013. При вводе туда числа должен появляться символ ₽ ( Unicode 20BD ). Если сделать в самом Excel формат ячейки "Денежный" то все нормально. Кстати, этот новый символ рубля сидит на Правом Alt + 8. Попробовал вставить формат, который выдает макрос: Selection.NumberFormat = "#,##0.00 $" Переделал под xHarbour: NumberFormat := '# ##0,00 $ ' Добавляется только символ доллара в конце, что навело на мысль попробовать формат '# ##0,00 p.' с английской p, или HB_OemToAnsi( '# ##0,00 руб.' ). Все получилось, буковки появляются, числа можно складывать и т.д. Но все-таки, как быть с символом ₽?
|
 |

|
|
|
| moderator
|
Пост N: 1009
Зарегистрирован: 20.02.11
|
|
Отправлено: 10.06.16 17:54. Заголовок: TimTim пишет: Попро..
TimTim пишет: цитата: | Попробовал вставить формат, который выдает макрос: Selection.NumberFormat = "#,##0.00 $" |
| макрос выдает другой формат при выборе значка рубля Selection.NumberFormat = "#,##0.00 [$?-419]" но OLE это тоже не понимает
|
 |

|
|
| постоянный участник
|
Пост N: 4965
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.06.16 13:21. Заголовок: Всем привет ! Исполь..
Всем привет ! Использую Ms Офис 2003 SP3. Периодически появляется дурацкая табличка: Как от неё избавиться ? Есть ли какой то флаг для этого сообщения ?
|
 |

|
|
| |
Пост N: 5709
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.06.16 13:29. Заголовок: Andrey Погугли..
Andrey Погугли
|
 |

|
|
| постоянный участник
|
Пост N: 4970
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.06.16 15:43. Заголовок: Dima пишет: Погугли..
Dima пишет: Ничего для себя не нашёл. Методом проб и ошибок выяснил - неправильную работу в МиниГуи функции oBrw:Excel2(...) при вот вот таком формате вывода в Эксель: oBrw:aColumns[nJ]:cDataType := 'N' oBrw:aColumns[nJ]:cPicture := '99:99' Как исправить ?
|
 |

|
|
| постоянный участник
|
Пост N: 5041
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.08.16 22:34. Заголовок: Обрезает нули в Ексе..
Обрезает нули в Екселе для текстового формата. Вывожу текстовые данные поля бд в ячейку - типа "0000345", указываю в ячейке формат: oSheet:Cells( nLine, nI ):SET( "NumberFormat", '@' ) // текстовая ячейка Как избавиться от обрезания ?
|
 |

|
|
| |
Пост N: 5944
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.08.16 08:43. Заголовок: Поставь формат что т..
Поставь формат что то типа 0000000000 Где кол-во нулей равно длине строки в твоем случае 0000000
|
 |

|
|
| постоянный участник
|
Пост N: 5042
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.08.16 12:26. Заголовок: Dima пишет: Постав..
Dima пишет: цитата: | Поставь формат что то типа 0000000000 |
| Спасибо ! Но тогда разрушается универсальность функции перекодировки Dbf->Xls. Текстовые данные могут быть разными. Я у себя делаю так: Скрытый текст ............ cPole := aField[ nI , 1 ] xValue := FIELDGET( FIELDNUM( cPole ) ) // значени полей DBF nDecPole := FieldDec( FIELDNUM( cPole ) ) // для формата числа oSheet:Cells( nLine, nI ):Value := xValue IF FIELDTYPE( cPole ) == "C" oSheet:Cells( nLine, nI ):SET( "NumberFormat", '@' ) // текстовая ячейка ELSEIF FIELDTYPE( cPole ) == "N" IF nDecPole == 0 // значит целое число oSheet:Cells( nLine, nI ):SET( 'NumberFormat', '## ### ###0' ) // числовая ячейка ELSE oSheet:Cells( nLine, nI ):SET( 'NumberFormat', '## ### ###0,00' ) // числовая ячейка ENDIF ELSEIF FIELDTYPE( cPole ) == "D" oSheet:Cells( nLine, nI ):SET( "NumberFormat", 'm/d/yy' ) // дата ячейка ELSE oSheet:Cells( nLine, nI ):SET( "NumberFormat", '@' ) // текстовая ячейка ENDIF .....
|
|
 |

|
|
| |
Пост N: 5945
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.08.16 12:28. Заголовок: Andrey Тогда читай ..
|
 |

|
|
| |
Пост N: 5946
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.08.16 16:52. Заголовок: Andrey пишет: IF FI..
Andrey пишет: цитата: | IF FIELDTYPE( cPole ) == "C" oSheet:Cells( nLine, nI ):SET( "NumberFormat", '@' ) // текстовая ячейка |
| а вот тут нужна доп проверка а не цифры ли там одни живут и если так то NumberFormat будет другим. PS По ходу не нашел (может искал плохо или еще что  ) такой функции "а не цифры ли там одни живут" , так что придется лепить свою.
|
 |

|
|
| moderator
|
Пост N: 1036
Зарегистрирован: 20.02.11
|
|
Отправлено: 07.08.16 11:35. Заголовок: Andrey пишет: Я у с..
Andrey пишет: Попробуй сначала задать формат а потом присвоить значение в ячейку
|
 |

|
|
|
| |
Пост N: 5947
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.08.16 13:53. Заголовок: Haz пишет: Попробуй..
Haz пишет: цитата: | Попробуй сначала задать формат а потом присвоить значение в ячейку |
| Работает однако.
|
 |

|
|
| |
Пост N: 6010
Зарегистрирован: 17.05.05
|
|
Отправлено: 13.09.16 21:54. Заголовок: Может и была тема , ..
Может и была тема , не нашел. Нужно через Ole , иметь возможность только смотреть и печатать документ Excel. PS Сам документ формируется с установкой пароля на изменение. С этим нет проблем.
|
 |

|
|
| Администратор
|
Пост N: 3484
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.09.16 07:56. Заголовок: Можно вызвать метод:..
Можно вызвать метод: Sheet:PrintPreview()
|
 |

|
|
| |
Пост N: 6011
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.09.16 08:05. Заголовок: Pasha пишет: Можно ..
Pasha пишет: цитата: | Можно вызвать метод: Sheet:PrintPreview() |
| Да не плохой вариант , но если закрыть Preview то снова окажусь в Excel а там делай что хош.
|
 |

|
|
| Администратор
|
Пост N: 3485
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.09.16 09:11. Заголовок: А если так: Excel:V..
А если так: Excel:Visible := .t. Sheet:PrintPreview() Excel:Visible := .f.
|
 |

|
|
| |
Пост N: 6012
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.09.16 09:19. Заголовок: Pasha пишет: Excel:..
Pasha пишет: Заработало Спасибо
|
 |

|
|
| Администратор
|
Пост N: 3494
Зарегистрирован: 23.05.05
|
|
Отправлено: 07.10.16 08:46. Заголовок: В office 2013 и offi..
В office 2013 и office 2010 с последними обновлениями появилась новая неприятная хворь: При открытии документа методом Excel:Workbooks:Open происходит или ошибка открытия, или зависание при выполнении метода. Хворь проявляется у Excel, и иногда у Word. У меня шаблоны документов хранятся на letodb сервере. Перед открытием я их копирую в папку temp из getenv('temp'). Причем одни шаблоны могут открываться нормально (это Word), а другие - нет. С Excel ситуация такая: после открытия документа он заполняется, и остается на экране для дальнейших действий с ним пользователя. Пользователь что-то с ним делает (печатает), и закрывает Excel. Оказывается, что процесс Excel остается висеть в памяти, а шаблон в папке Temp залочен им, и последующее открытие этого шаблона невозможно. Причем, такая ситуация проявляется нестабильно: два раза Excel может закрыться нормально, а на третий - затык. Если не переписывать файлы в папку temp, а хранить их в другой папке, то хворь не проявляется совсем. Иногда хворь проходит, если пошаманить с таким бубном: "Откройте вкладку Файл, чтобы переключиться в представление Microsoft Office Backstage. В меню Справка выберите пункт Параметры; отобразится диалоговое окно Параметры. Щелкните элемент Центр управления безопасностью и нажмите кнопку Параметры центра управления безопасностью. В центре управления безопасностью щелкните пункт Параметры блокировки файлов. Установите флажок Открывать выбранные типы файлов в режиме защищенного просмотра и разрешить редактирование." Но такие танцы с бубном помогают не во всех случаях. Пока я выкручиваюсь заменой магической заколдованной папки temp на другую папку, а там кто знает, как эта хворь будет вести себя дальше. Если занемог Office 2010 и обновлениями, то помогает его снос и установка версии с диска и отключением обновлений. У Office 2013 хворь врожденная.
|
 |

|
|
| |
Пост N: 6042
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.10.16 09:48. Заголовок: Pasha пишет: Перед ..
Pasha пишет: цитата: | Перед открытием я их копирую в папку temp из getenv('temp') |
| Тоже так делаю , но в папке Temp создаю свою папку и уже копирую в нее , проблем не было ни разу. PS Office 2003
|
 |

|
|
| Администратор
|
Пост N: 3495
Зарегистрирован: 23.05.05
|
|
Отправлено: 07.10.16 09:51. Заголовок: проблем не было ни р..
Значит, жди сюрпризов с новыми офисами.
|
 |

|
|
| |
Пост N: 6043
Зарегистрирован: 17.05.05
|
|
Отправлено: 07.10.16 13:26. Заголовок: Pasha Ключевая фраз..
Pasha Ключевая фраза "в папке Temp создаю свою папку и уже копирую в нее" , может и у тебя сработает кто знает.
|
 |

|
|
|
| |
Пост N: 11
Зарегистрирован: 04.04.16
|
|
Отправлено: 23.12.16 02:48. Заголовок: для справки Задача ..
для справки Задача - Переместить лист в первую позицию Исходные данные ----------------------------------- 1. Макрос Sheets("Лист3").Select Sheets("Лист3").Move Before:=Sheets(1) ----------------------------------- 2.Функция VBA Moves the sheet to another location in the workbook. expression.Move(Before, After) expression Required. An expression that returns an object in the Applies To list. Before Optional Variant. The sheet before which the moved sheet will be placed. You cannot specify Before if you specify After. After Optional Variant. The sheet after which the moved sheet will be placed. You cannot specify After if you specify Before. Remarks If you don't specify either Before or After, Microsoft Excel creates a new workbook that contains the moved sheet. Example This example moves Sheet1 after Sheet3 in the active workbook. Worksheets("Sheet1").Move after:=Worksheets("Sheet3") ----------------------------------- 3.Работающий вариант oBook:Sheets("Итого"):Move( oBook:Sheets(1) ) //поставить перед листом N1
|
 |

|
|
| |
Пост N: 97
Зарегистрирован: 09.09.11
|
|
Отправлено: 05.01.17 08:05. Заголовок: Добрый день, как вер..
Добрый день, как вернуть активным окно программы, после запуска Excel (формирование сводного отчета. 60 и более листов) из отдельных Excel файлов...? начало формирования сводного отчета oExcel_S:=ToleAuto():New("Excel.Application") oExcel_S:Workbooks:Open(Day_Excel) oExcel_S:Set("DisplayAlerts",.F.) oExcel_S:Visible :=.T. oBook_S :=oExcel_S:ActiveWorkBook oAs_S :=oExcel_S:ActiveSheet() oSheet_S:=oBook_S :Sheets(1):Select() oSheet_S:=oBook_S :Sheets(1) oAs_S :Cells(1,15):Select() .... формирование листов из отдельных Excel файлов // переход к сводному отчету Hb_GtInfo(HB_GTI_CLIPBOARDDATA, "") oSheet_S:=oBook_S :Sheets(1):Select() oBook_S :=oExcel_S :ActiveWorkBook oAs_S :=oExcel_S :ActiveSheet() oSheet_S:=oBook_S :Sheets(1) oAs_S :Cells(1,5):Select() oSheet_S:Cells(1,5):Value=Dtoc(Date())+', '+Substr(Time(),1,5) oAs_S :Cells(1,7):Select() oSheet_S:Cells(1,7):Value=SecToTim(Seconds()-Start_Beg) oAs_S :Cells(1,1):Select() oBook_S :SaveAs(Upper(Day_Excel)) oExcel_S:Quit() oAs_S :=Nil oRange_S:=Nil oBook_S :=Nil oExcel_S:=Nil использовать oExcel_S:Visible :=.F. не вариант, надо что бы процесс формирования сводного Excel отчета был виден в фоновом окне, а окно программы стало активным... PS:xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 6476)
|
 |

|
|
| постоянный участник
|
Пост N: 5282
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.01.17 11:21. Заголовок: Oskar_AAA пишет: ка..
Oskar_AAA пишет: цитата: | как вернуть активным окно программы, после запуска Excel |
| Надо получить хендл своей программы и переключиться на неё. Используй несколько функций из МиниГуи: GETWINDOW() потом BRINGWINDOWTOTOP() Скрытый текст #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include <shlobj.h> #include "hbapi.h" #include "hbapiitm.h" #include "hbvm.h" // ---------------- взято из MiniGui ----------------------------- HB_FUNC( FINDWINDOWEX ) { hb_retnl( ( LONG ) FindWindowEx( ( HWND ) hb_parnl( 1 ), ( HWND ) hb_parnl( 2 ), ( LPCSTR ) hb_parc( 3 ), ( LPCSTR ) hb_parc( 4 ) ) ); } HB_FUNC( ISICONIC ) { hb_retl( IsIconic( (HWND) hb_parnl(1)) ); } HB_FUNC( SETFOREGROUNDWINDOW ) { SetForegroundWindow( ( HWND ) hb_parnl( 1 ) ); } // --------------------------------------------- HB_FUNC( ISEXERUNNING ) // ( cExeNameCaseSensitive ) --> lResult { HANDLE hMutex = CreateMutex( NULL, TRUE, (LPTSTR) hb_parc(1) ); hb_retl( GetLastError() == ERROR_ALREADY_EXISTS ); ReleaseMutex( hMutex ); } HB_FUNC( GETFOREGROUNDWINDOW ) { hb_retnl( (LONG) GetForegroundWindow() ); } HB_FUNC( BRINGWINDOWTOTOP ) { BringWindowToTop( ( HWND ) hb_parnl(1) ); } HB_FUNC ( FINDWINDOW ) { hb_retnl( ( LONG ) FindWindow( 0, hb_parc( 1 ) ) ); } HB_FUNC( MINIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_MINIMIZE ); } HB_FUNC( MAXIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_RESTORE ); ShowWindow( (HWND) hb_parnl(1), SW_MAXIMIZE ); } HB_FUNC( MAXIRESTORE ) { ShowWindow( (HWND) hb_parnl(1), SW_RESTORE ); } HB_FUNC( GETWINDOWTEXT ) { int iLen = SendMessage( (HWND) hb_parnl(1), WM_GETTEXTLENGTH, 0, 0 ) + 1; char *cText = ( char * ) hb_xgrab( iLen ); GetWindowText( (HWND) hb_parnl(1), (LPTSTR) cText, iLen ); hb_retc( cText ); hb_xfree( cText ); } HB_FUNC( GETWINDOW ) { hb_retnl( (LONG) GetWindow((HWND) hb_parnl(1), hb_parni(2)) ); } #pragma ENDDUMP
| Только вот как получить хендл своей программы в хХарборе пока не знаю...
|
 |

|
|
| |
Пост N: 98
Зарегистрирован: 09.09.11
|
|
Отправлено: 05.01.17 11:32. Заголовок: Тоже попробовал испо..
Тоже попробовал использовать HB_FUNC( MINIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_MINIMIZE ); } HB_FUNC( MAXIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_RESTORE ); ShowWindow( (HWND) hb_parnl(1), SW_MAXIMIZE ); } HB_FUNC( MAXIRESTORE ) { ShowWindow( (HWND) hb_parnl(1), SW_RESTORE ); } тестирую...
|
 |

|
|
| постоянный участник
|
Пост N: 5283
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.01.17 11:34. Заголовок: Вот ещё посмотри, дл..
Вот ещё посмотри, для хХарбора раньше делал: Скрытый текст ************************************************************************* * Copyright : (c) 2008, Verchenko Andrey. E-mail: 30195@mail.ru * : Все права сохраняются. * Date : 11/11/2008 * Avtor : Верченко Андрей * Rem : Получение списка ХЕНДЛов окон и ИМЕН окон запущенных в системе * : только на xHarbour'e * : Отдельное СПАСИБО модераторам: Петру и Григорию * : http://clipper.borda.ru/?1-1-0-00000159-000-0-1-1226399294 ************************************************************************** #include "common.ch" #include "inkey.ch" FUNCTION MAIN() LOCAL aStart := {}, nI, aMenu:={}, aItems:={}, nSelect, cTemp LOCAL nSEL, cMess, aOpt cMess := "Выберите действие с этим процессом..." aOpt := {"Свернуть","Развернуть","Спрятать","Показать","Убить"} STRFILE("","Process.lst", .F.) aStart := GetWindowList() // Считать ХЕНДЛ окна и ИМЯ окна FOR nI:= 1 TO LEN(aStart) AADD( aMenu, { aStart[nI,1], HB_ANSITOOEM(aStart[nI,2]) } ) cTemp := STR(aStart[nI,1])+", "+HB_ANSITOOEM(aStart[nI,2]) AADD( aItems, cTemp ) STRFILE( cTemp+CHR(13)+CHR(10),"Process.lst",.T.) NEXT CLEAR SCREEN @ 1,7 SAY "Хендл окна Название окна" COLOR("11/0") DO WHILE LastKey() <> K_ESC nSelect := Achoice( 2, 5, MaxRow()-2, 75, aItems, .T. ) IF nSelect <> 0 // ВЫБОР ДЕЙСТВИЯ nSEL := Alert(cMess,aOpt) DO CASE CASE nSEL == 1 MINIMIZE( aStart[nSelect,1] ) Alert("Окно было свернуто") CASE nSEL == 2 // Display selected file MAXIMIZE( aStart[nSelect,1] ) Alert("Окно было развернуто на весь экран") CASE nSEL == 3 HIDE( aStart[nSelect,1]) Alert("Окно сделано невидимым") CASE nSEL == 4 SSHOW( aStart[nSelect,1]) Alert("Окно стало видимым") CASE nSEL == 5 KKILL( aStart[nSelect,1]) Alert("Окну отправлена команда на закрытие") ENDCASE KEYBOARD Chr(255) // sets Lastkey() to 255 Inkey() ENDIF ENDDO RETURN NIL #define GW_HWNDFIRST 0 #define GW_HWNDLAST 1 #define GW_HWNDNEXT 2 #define GW_HWNDPREV 3 #define GW_OWNER 4 #define GW_CHILD 5 function GetWindowList() LOCAL aWindows := {}, cTitle := "" LOCAL hWnd := GetWindow( GetForegroundWindow(), GW_HWNDFIRST ) WHILE hWnd != 0 // Loop through all the windows if !empty(cTitle := GetWindowText( hWnd )) AADD( aWindows, {hWnd, upper(cTitle)} ) endif hWnd := GetWindow( hWnd, GW_HWNDNEXT ) // Get the next window ENDDO return aWindows #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include <shlobj.h> #define VM_CLOSE 16 HB_FUNC( ISEXERUNNING ) // ( cExeNameCaseSensitive ) --> lResult { HANDLE hMutex = CreateMutex( NULL, TRUE, (LPTSTR) hb_parc(1) ); hb_retl( GetLastError() == ERROR_ALREADY_EXISTS ); ReleaseMutex( hMutex ); } HB_FUNC( GETFOREGROUNDWINDOW ) { hb_retnl( (LONG) GetForegroundWindow() ); } HB_FUNC( MINIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_MINIMIZE ); } HB_FUNC( MAXIMIZE ) { ShowWindow( (HWND) hb_parnl(1), SW_RESTORE ); } HB_FUNC( HIDE ) { ShowWindow( (HWND) hb_parnl(1), SW_HIDE ); } HB_FUNC( SSHOW ) { ShowWindow( (HWND) hb_parnl(1), SW_SHOW ); } HB_FUNC( KKILL ) { SendMessage( (HWND) hb_parnl(1), VM_CLOSE,0,0); //DestroyWindow( (HWND) hb_parnl(1), VM_CLOSE); } HB_FUNC( GETWINDOWTEXT ) { int iLen = SendMessage( (HWND) hb_parnl(1), WM_GETTEXTLENGTH, 0, 0 ) + 1; char *cText = ( char * ) hb_xgrab( iLen ); GetWindowText( (HWND) hb_parnl(1), (LPTSTR) cText, iLen ); hb_retc( cText ); hb_xfree( cText ); } HB_FUNC( GETWINDOW ) { hb_retnl( (LONG) GetWindow((HWND) hb_parnl(1), hb_parni(2)) ); } #pragma ENDDUMP
|
|
 |

|
|
| |
Пост N: 6236
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.01.17 13:42. Заголовок: Oskar_AAA Попробуй ..
Oskar_AAA Попробуй где то в самом начале своей программы после любого вывода на экран получить хендл своего окна с помощью GETFOREGROUNDWINDOW (взять можно в Минигуи) А после запуска Excel используй ShowWindow + BringWindowToTop (взять можно в Минигуи)
|
 |

|
|
| |
Пост N: 100
Зарегистрирован: 09.09.11
|
|
Отправлено: 05.01.17 14:01. Заголовок: Dima можно выслать и..
Dima можно выслать из Минигуи GETFOREGROUNDWINDOW и ShowWindow + BringWindowToTop я не работал в Минигуи... Спасибо...
|
 |

|
|
| |
Пост N: 6237
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.01.17 14:04. Заголовок: Oskar_AAA #pragma ..
Oskar_AAA #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> HB_FUNC (GETFOREGROUNDWINDOW) { HWND hWnd = GetForegroundWindow(); hb_retnl ((LONG) hWnd); } #pragma ENDDUMP #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include "hbapiitm.h" HB_FUNC( BRINGWINDOWTOTOP ) { BringWindowToTop( ( HWND ) hb_parnl( 1 ) ); } HB_FUNC( SHOWWINDOW ) { ShowWindow( ( HWND ) hb_parnl( 1 ), HB_ISNUM( 2 ) ? hb_parni( 2 ) : SW_SHOW ); } HB_FUNC( SETFOCUS ) { hb_retnl( ( LONG_PTR ) SetFocus( ( HWND ) hb_parnl( 1 ) ) ); } HB_FUNC( SETFOREGROUNDWINDOW ) { SetForegroundWindow( ( HWND ) hb_parnl( 1 ) ); } #pragma ENDDUMP
|
 |

|
|
| |
Пост N: 101
Зарегистрирован: 09.09.11
|
|
Отправлено: 05.01.17 14:15. Заголовок: Спасибо, начну тести..
Спасибо, начну тестировать...
|
 |

|
|
| |
Пост N: 102
Зарегистрирован: 09.09.11
|
|
Отправлено: 05.01.17 14:32. Заголовок: Dima вылетает по оши..
Dima вылетает по ошибке Warning W8065 Call to function 'HB_ISNUM' with no prototype in function HB_FUN_SHOWWINDOW вот фрагмент головного модуля... Procedure MAIN(Shifr) //INGAZ # Include 'Achoice.Ch' # Include 'Inkey.Ch' # Include 'Directry.Ch' # Include 'Setcurs.Ch' # Include 'Dbstruct.Ch' # Include 'Command.Ch' # Include 'Dbedit.Ch' # Include 'Excel.Ch' # Include 'Hbgtinfo.Ch' # Include 'Dbedit.Ch' Public Ctitle Ctitle:='INGAZ' C_Title=Ctitle+'.EXE' // SetConsoleTitle(cTitle) hWnd := FindWindow( cTitle ) DeleteCloseButton( hWnd ) #PRAGMA BEGINDUMP # include "Hbapi.h" # include "Windows.h" # include "Hbapiitm.h" HB_FUNC( SETCONSOLETITLE ) { hb_retl( SetConsoleTitle( hb_parc( 1 ) ) ) ; } HB_FUNC( FINDWINDOW ) { hb_retnl( (LONG)FindWindow( NULL, hb_parc( 1 ) ) ) ; } HB_FUNC( DELETECLOSEBUTTON ) { DeleteMenu(GetSystemMenu( (HWND)hb_parnl( 1 ), FALSE), SC_CLOSE, MF_BYCOMMAND ) ; DrawMenuBar( (HWND)hb_parnl( 1 ) ) ; } HB_FUNC_STATIC( SETFILEAPIS ) // OEM { SetFileApisToOEM(); } HB_FUNC (GETFOREGROUNDWINDOW) { HWND hWnd = GetForegroundWindow(); hb_retnl ((LONG) hWnd); } HB_FUNC( BRINGWINDOWTOTOP ) { BringWindowToTop( ( HWND ) hb_parnl( 1 ) ); } HB_FUNC( SHOWWINDOW ) { ShowWindow( ( HWND ) hb_parnl( 1 ), HB_ISNUM( 2 ) ? hb_parni( 2 ) : SW_SHOW ); } HB_FUNC( SETFOCUS ) { hb_retnl( ( LONG_PTR ) SetFocus( ( HWND ) hb_parnl( 1 ) ) ); } HB_FUNC( SETFOREGROUNDWINDOW ) { SetForegroundWindow( ( HWND ) hb_parnl( 1 ) ); } #pragma ENDDUMP // REQUEST HB_CODEPAGE_RU866 REQUEST DBFCDX,DBFFPT HB_SetCodePage( "RU866" ) RDDSetDefault('DBFCDX') SetMode(25,80)
|
 |

|
|
|
| |
Пост N: 6238
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.01.17 15:13. Заголовок: Oskar_AAA пишет: вы..
Oskar_AAA пишет: цитата: | вылетает по ошибке Warning W8065 Call to function 'HB_ISNUM' |
| Нужно смотреть какой аналог этой функции в Xharbour , я "сижу" на Harbour
|
 |

|
|
| Администратор
|
Пост N: 3521
Зарегистрирован: 23.05.05
|
|
Отправлено: 05.01.17 15:36. Заголовок: ISNUM( 2 ) регистр ..
ISNUM( 2 ) регистр существенен.
|
 |

|
|
| |
Пост N: 103
Зарегистрирован: 09.09.11
|
|
Отправлено: 05.01.17 18:37. Заголовок: Коллеги, функция SE..
Коллеги, функция SETCONSOLETITLE (удаление возможности закрыть программу по "крестику") работает не зависимо от регистра.. в HbApi.h нашел #define ISNUM( n ) ( hb_param( n, HB_IT_NUMERIC ) != NULL )
|
 |

|
|
| |
Пост N: 6239
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.01.17 18:53. Заголовок: Oskar_AAA пишет: Ко..
Oskar_AAA пишет: цитата: | Коллеги, функция SETCONSOLETITLE (удаление возможности закрыть программу по "крестику") работает не зависимо от регистра.. |
| Не вижу связи крестика и функции что рисует заголовок у окна. Или я вопрос не понял ?
|
 |

|
|
| |
Пост N: 104
Зарегистрирован: 09.09.11
|
|
Отправлено: 05.01.17 18:57. Заголовок: Pasha пишет: ISNUM( ..
Pasha пишет: ISNUM( 2 ) регистр существенен.
|
 |

|
|
| |
Пост N: 105
Зарегистрирован: 09.09.11
|
|
Отправлено: 05.01.17 21:09. Заголовок: Добрый вечер, с Ваше..
Добрый вечер, с Вашей помощью вот что получилось: В головной программе, после вывода меню на экран Handl_Win=GetForeGroundWindow() ?Handl_Win 5178634 далее обработка БД и создание Xls файлов (43 шт) создание из макета сводного отчета Xls с 42 листами oExcel_S:=ToleAuto():New("Excel.Application") oExcel_S:Workbooks:Open(Day_Excel) oExcel_S:Set("DisplayAlerts",.F.) oExcel_S:Visible :=.T. // ¢¨§ã «¨§ æ¨ï ᢮¤-®£® ®âç¥â oBook_S :=oExcel_S:ActiveWorkBook oAs_S :=oExcel_S:ActiveSheet() oSheet_S:=oBook_S :Sheets(1):Select() oSheet_S:=oBook_S :Sheets(1) oAs_S :Cells(1,15):Select() oSheet_S:Cells(1,15):Value=Cdata // ¤ â ®âç¥â oSheet_S:Cells(1,18):Value=Bom(Cdata) // ¤ â - ç « ¬¥áïæ oAs_S :Cells(1,1):Select() // ShowWindow(Handl_Win) BringWindowToTop(Handl_Win) SetFocus(Handl_Win) ?Handl_Win 5178634 wait перехода (активации) к программе из Excel не происходит... что сделано не так???
|
 |

|
|
| постоянный участник
|
Пост N: 5284
Зарегистрирован: 12.09.06
|
|
Отправлено: 05.01.17 21:52. Заголовок: Oskar_AAA пишет: пе..
Oskar_AAA пишет: цитата: | перехода (активации) к программе из Excel не происходит... что сделано не так??? |
| Найди хендл окна Excel и потом переключись на него ! Хенд у окна Excel получить просто - смотреть пример ExcelOle.prg .... выложил готовые примеры у Григория на сайте - http://hmgextended.com/applications.html // окно таблицы Excel на передний план hWnd := oExcel:hWnd ShowWindow( hWnd, 6 ) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 INKEYGUI(100) ShowWindow( hWnd, 3 ) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 BringWindowToTop( hWnd )
|
 |

|
|
| |
Пост N: 106
Зарегистрирован: 09.09.11
|
|
Отправлено: 05.01.17 21:58. Заголовок: Andrey окно Excel и ..
Andrey окно Excel и так является активным, мне надо его сделать видимым но не активным, т.е пусть будет на экране в фоновом режиме... или если Хенд Excel просто получить, надо сделать окно таблицы на второй план как? Спасибо. Посмотрю ссылки Григория
|
 |

|
|
| |
Пост N: 6240
Зарегистрирован: 17.05.05
|
|
Отправлено: 05.01.17 22:31. Заголовок: Oskar_AAA пишет: Sh..
Oskar_AAA пишет: Тут имеет значение 2 параметр если не ошибаюсь. Андрей уже показал. У Вас его нет совсем.
|
 |

|
|
| |
Пост N: 107
Зарегистрирован: 09.09.11
|
|
Отправлено: 05.01.17 22:57. Заголовок: поставил из из его м..
поставил из из его модуля hWnd := oExcel_S:hWnd ShowWindow( hWnd, 6 ) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 окно Excel стало маленьким, но осталось на переднем плане, как его сделать на ВТОРОМ плане?
|
 |

|
|
| |
Пост N: 490
Зарегистрирован: 17.06.10
|
|
Отправлено: 05.01.17 23:13. Заголовок: Поменять Z-последова..
Поменять Z-последовательность окна можно через SetWindowPos, а проще ShowWindow другого-какого окна вот Excel и уйдет в фон. Можно свое окно посадить на передний план
|
 |

|
|
| |
Пост N: 108
Зарегистрирован: 09.09.11
|
|
Отправлено: 05.01.17 23:29. Заголовок: FIL Как свое окно СН..
FIL Как свое окно СНОВА посадить на Передний план (вычислил Хедлы по своей программе и Excel). но : в головном модуле: Askar_Win=GetForeGroundWindow() hWnd := oExcel_S:hWnd *ShowWindow(hWnd,6) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 ShowWindow(hWnd,3) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 // ShowWindow(Askar_Win,3) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 BringWindowToTop(Askar_Win) на передний план сове окно не возвращается..
|
 |

|
|
| |
Пост N: 491
Зарегистрирован: 17.06.10
|
|
Отправлено: 05.01.17 23:42. Заголовок: SetWindowPos(hWnd, ..
SetWindowPos(hWnd, -1, 0,0,0,0,3)
|
 |

|
|
| |
Пост N: 6241
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.01.17 10:59. Заголовок: Oskar_AAA А если та..
Oskar_AAA А если так if isiconic(Askar_Win) SetForeGroundWindow(Askar_Win) endif ShowWindow(Askar_Win, 9) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 RESTORE=9 BringWindowToTop(Askar_Win) Задача под каким терминалом собрана ? Под GTWVT у меня такая связка работает.
|
 |

|
|
| |
Пост N: 109
Зарегистрирован: 09.09.11
|
|
Отправлено: 06.01.17 11:02. Заголовок: Dima попробуем, рахм..
Dima попробуем, рахмат... программа xHarbour - консольный 25 х 80,
|
 |

|
|
| |
Пост N: 110
Зарегистрирован: 09.09.11
|
|
Отправлено: 06.01.17 12:58. Заголовок: Dima где взять функ..
Dima где взять функцию Isconic()? if isiconic(Askar_Win) ///
|
 |

|
|
| постоянный участник
|
Пост N: 5285
Зарегистрирован: 12.09.06
|
|
Отправлено: 06.01.17 13:41. Заголовок: Oskar_AAA пишет: гд..
Oskar_AAA пишет: цитата: | где взять функцию Isconic()? |
| Смотри в этой ветке Пост N: 5282 HB_FUNC( ISICONIC )
|
 |

|
|
| |
Пост N: 111
Зарегистрирован: 09.09.11
|
|
Отправлено: 06.01.17 13:50. Заголовок: ok..
ok
|
 |

|
|
| |
Пост N: 6242
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.01.17 16:25. Заголовок: Oskar_AAA Наваял пр..
Oskar_AAA Наваял простой пример на Harbour , терминал STD. Запускаем пример и после куда то переключаемся. Через 10 секунд , окно примера появляется , но окно фокус ввода не получает , даже если и указать Setfocus(Askar_Win). Но если собрать под терминалом GTWVT , добавив REQUEST HB_GT_WVT_DEFAULT то все работает , как я выше и писал. PS Может Паша или Пётр чего подскажут Скрытый текст ? "Test" Askar_Win:=GETFOREGROUNDWINDOW() Inkey(10) if isiconic(Askar_Win) SetForeGroundWindow(Askar_Win) endif ShowWindow(Askar_Win, 9) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 RESTORE=9 BringWindowToTop(Askar_Win) wait ************** #pragma BEGINDUMP #include <windows.h> #include <hbapi.h> #include "hbapiitm.h" HB_FUNC (GETFOREGROUNDWINDOW) { HWND hWnd = GetForegroundWindow(); hb_retnl ((LONG) hWnd); } HB_FUNC( BRINGWINDOWTOTOP ) { BringWindowToTop( ( HWND ) hb_parnl( 1 ) ); } HB_FUNC( ISICONIC ) { hb_retl( IsIconic( ( HWND ) hb_parnl( 1 ) ) ); } HB_FUNC( SHOWWINDOW ) { ShowWindow( ( HWND ) hb_parnl( 1 ), HB_ISNUM( 2 ) ? hb_parni( 2 ) : SW_SHOW ); } HB_FUNC( SETFOCUS ) { hb_retnl( ( LONG_PTR ) SetFocus( ( HWND ) hb_parnl( 1 ) ) ); } HB_FUNC( SETFOREGROUNDWINDOW ) { SetForegroundWindow( ( HWND ) hb_parnl( 1 ) ); } #pragma ENDDUMP
|
|
 |

|
|
| |
Пост N: 112
Зарегистрирован: 09.09.11
|
|
Отправлено: 06.01.17 17:37. Заголовок: Dima программа xHarb..
Dima программа xHarbour Compiler build 1.2.1 (SimpLex) (Rev. 6476). консольная (25 х 80) REQUEST HB_CODEPAGE_RU866 REQUEST DBFCDX,DBFFPT HB_SetCodePage( "RU866" ) RDDSetDefault('DBFCDX') SetMode(25,80) если REQUEST HB_GT_WVT REQUEST HB_GT_WVT_DEFAULT и подключаю GTWVT.lib при запуске программы выводится сообщение Unrecoverable error 10001 It's not a GUI programm переделывать под GUI - времени вообще нет... PS все функции Ваши & Andrey собрались и по ним ошибок при сборке программы нет. If Isiconic(Askar_Win) SetForeGroundWindow(Askar_Win) Endif ShowWindow(Askar_Win,9) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 RESTORE=9 BringWindowToTop(Askar_Win) set color to w/n ?hWnd,Askar_Win,Isiconic(Askar_Win) wait выдают числовые значения, Isiconic(Askar_Win)= .F.
|
 |

|
|
| |
Пост N: 6243
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.01.17 17:45. Заголовок: Oskar_AAA К сожален..
Oskar_AAA К сожалению по Xharbour ни чего сказать не могу , давно слез с него на Harbour
|
 |

|
|
| |
Пост N: 113
Зарегистрирован: 09.09.11
|
|
Отправлено: 06.01.17 17:59. Заголовок: Коллеги, получилось..
Коллеги, получилось в консольном xHarbour управлять окном и размером окна Excel с передачей фокуса на программу. Dima, Andrey и всем откликнувшемся - Рахмат # Include 'Achoice.Ch' # Include 'Command.Ch' # Include 'Dbedit.Ch' # Include 'Dbstruct.Ch' # Include 'Directry.Ch' # Include 'Excel.Ch' # Include 'Inkey.Ch' # Include 'Setcurs.Ch' # Include 'Hbgtinfo.Ch' // крестик на окне программы SetConsoleTitle(CTitle) hWnd:=FindWindow(CTitle) DeleteCloseButton(hWnd) // имена файлов в кириллице SetFileApis() // •Ґ-¤« ®Є®- Public Askar_Win1,Askar_Win2 Askar_Win1=GetForeGroundWindow() Askar_Win2=GetWindow() // REQUEST HB_CODEPAGE_RU866 REQUEST DBFCDX,DBFFPT HB_SetCodePage( "RU866" ) RDDSetDefault('DBFCDX') SetMode(25,80) обработка и так далее (создание временных Excel файлов....) создание сводного Excel отчета со многими листами из временных Excel файлов oExcel_S:=ToleAuto():New("Excel.Application") oExcel_S:Workbooks:Open(Day_Excel) oExcel_S:Set("DisplayAlerts",.F.) oExcel_S:Visible :=.T. // ўЁ§г «Ё§ жЁп бў®¤-®Ј® ®взҐв oBook_S :=oExcel_S:ActiveWorkBook oAs_S :=oExcel_S:ActiveSheet() oSheet_S:=oBook_S :Sheets(1):Select() oSheet_S:=oBook_S :Sheets(1) oAs_S :Cells(1,15):Select() oSheet_S:Cells(1,15):Value=Cdata // ¤ в ®взҐв oSheet_S:Cells(1,18):Value=Bom(Cdata) // ¤ в - з « ¬Ґбпж oAs_S :Cells(1,1):Select() // управление окнами hWnd := oExcel_S:hWnd ShowWindow(hWnd,3) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 RESTORE=9 If Askar_Win1>0 SetForeGroundWindow(Askar_Win1) Endif ShowWindow(Askar_Win1,9) //SW_MAXIMIZE=3 SW_NORMAL=1 SW_MINIMIZE=6 RESTORE=9 BringWindowToTop(Askar_Win1) // вывод программы на ПЕРЕДНИЙ план сборка листов отчета #PRAGMA BEGINDUMP # include "Hbapi.h" # include "Windows.h" # include "Hbapiitm.h" # include "Shlobj.h" HB_FUNC( SETCONSOLETITLE ) { hb_retl( SetConsoleTitle( hb_parc( 1 ) ) ) ; } HB_FUNC( FINDWINDOW ) { hb_retnl( (LONG)FindWindow( NULL, hb_parc( 1 ) ) ) ; } HB_FUNC( DELETECLOSEBUTTON ) { DeleteMenu(GetSystemMenu( (HWND)hb_parnl( 1 ), FALSE), SC_CLOSE, MF_BYCOMMAND ) ; DrawMenuBar( (HWND)hb_parnl( 1 ) ) ; } HB_FUNC( SETFILEAPIS ) // OEM { SetFileApisToOEM(); } HB_FUNC( ISICONIC ) { hb_retl( IsIconic( (HWND) hb_parnl(1)) ); } // ®ЇаҐ¤Ґ«Ґ-ЁҐ ЄвЁў-®Ј® ®Є- HB_FUNC (GETFOREGROUNDWINDOW) { HWND hWnd = GetForegroundWindow(); hb_retnl ((LONG) hWnd); } HB_FUNC( BRINGWINDOWTOTOP ) { BringWindowToTop( ( HWND ) hb_parnl( 1 ) ); } HB_FUNC( SHOWWINDOW ) { ShowWindow( ( HWND ) hb_parnl( 1 ), SW_SHOW ); } HB_FUNC( SETFOCUS ) { hb_retnl( ( LONG_PTR ) SetFocus( ( HWND ) hb_parnl( 1 ) ) ); } HB_FUNC( SETFOREGROUNDWINDOW ) { SetForegroundWindow( ( HWND ) hb_parnl( 1 ) ); } HB_FUNC( GETWINDOWTEXT ) { int iLen = SendMessage( (HWND) hb_parnl(1), WM_GETTEXTLENGTH, 0, 0 ) + 1; char *cText = ( char * ) hb_xgrab( iLen ); GetWindowText( (HWND) hb_parnl(1), (LPTSTR) cText, iLen ); hb_retc( cText ); hb_xfree( cText ); } HB_FUNC( GETWINDOW ) { hb_retnl( (LONG) GetWindow((HWND) hb_parnl(1), hb_parni(2)) ); } #PRAGMA ENDDUMP
|
 |

|
|
| |
Пост N: 6244
Зарегистрирован: 17.05.05
|
|
Отправлено: 06.01.17 22:31. Заголовок: Oskar_AAA пишет: и ..
Oskar_AAA пишет: цитата: | и подключаю GTWVT.lib при запуске программы выводится сообщение Unrecoverable error 10001 It's not a GUI programm переделывать под GUI - времени вообще нет... |
| GUI тут совсем не при чем.
|
 |

|
|
| Администратор
|
Пост N: 3522
Зарегистрирован: 23.05.05
|
|
Отправлено: 08.01.17 09:53. Заголовок: Здесь: https://suppo..
Здесь: https://support.microsoft.com/ru-ru/kb/124103 написано, как получить hWnd для консоли через вызов FindWindow так же есть оговорка: Полученный дескриптор HWND не обязательно подходит для всех операций дескриптор окна. Если немного модифицировать функции winapi, чтобы проанализировать возвращаемые значения: HB_FUNC( BRINGWINDOWTOTOP ) { hb_retnl( BringWindowToTop( ( HWND ) hb_parnl( 1 ) ) ); } HB_FUNC( SETFOREGROUNDWINDOW ) { hb_retnl( SetForegroundWindow( ( HWND ) hb_parnl( 1 ) ) ); } и сделать тест: Function TestWnd Local ch := hb_gtinfo(HB_GTI_WINTITLE) Local hWnd1 := FindWindow(ch) Local hWnd2 := FindWindow('Паук') ? SETFOREGROUNDWINDOW(hWnd2) ? BringWindowToTop(hWnd2) Inkey(2) ? SETFOREGROUNDWINDOW(hWnd1) ? BringWindowToTop(hWnd1) return nil Запустить игрушку паук, и этот тест. Результат: ? SETFOREGROUNDWINDOW(hWnd1) возвращает 0, то есть не работает Похоже, здесь срабатывает та самая оговорка.
|
 |

|
|
| |
Пост N: 114
Зарегистрирован: 09.09.11
|
|
Отправлено: 08.01.17 12:14. Заголовок: Спасибо, за советы и..
Спасибо, за советы и участие. Обошелся проверкой на значение GetForeGroundWindow() >0 . Получилось то, что хотел в консоли
|
 |

|
|
| |
Пост N: 16
Зарегистрирован: 22.09.13
|
|
Отправлено: 28.01.17 11:28. Заголовок: Надо очистить таблиц..
Надо очистить таблицу от пустых строк. Что-то из Harbour никак не получается... Может кто подскажет? Спасибо
|
 |

|
|
| |
Пост N: 6260
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.01.17 13:33. Заголовок: fokinal21 пишет: На..
fokinal21 пишет: цитата: | Надо очистить таблицу от пустых строк |
| Вопрос не очень понятен.
|
 |

|
|
| |
Пост N: 6262
Зарегистрирован: 17.05.05
|
|
Отправлено: 28.01.17 15:17. Заголовок: fokinal21 Может име..
fokinal21 Может имелось в виду скрыть диапазон строк ?
|
 |

|
|
| |
Пост N: 17
Зарегистрирован: 22.09.13
|
|
Отправлено: 28.01.17 17:25. Заголовок: Есть таблица в Excel..
Есть таблица в Excel, надо удалить пустые строки В моем частном случае дело упрощается тем, что их можно определить по пустым ячейкам первого столбца В vba это решается просто и понятно: Sub RowDel() LastRow = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count Application.ScreenUpdating = False For r = LastRow To 1 Step -1 If Application.Rows(r).Columns(1).Value = "" Then Rows(r).Delete Next r End Sub Попытался перевести все это в Harbour и вот что получилось : Function RowDel() oExcel := CreateObject( "Excel.Application" ) oExcel:Workbooks:Open(Getfile()) oList := oExcel:Get( "ActiveSheet" ) oExcel:Visible("True") LastRow:= oList:UsedRange:Row-1 + oList:UsedRange:Rows:Count For r = LastRow To 1 Step -1 If oExcel:Rows(r):Columns(1):Value <>"" oExcel:Rows(r):Delete() endif Next r return при этом, если в vba прога срабатывает при Value = "", что логически верно, то в Harbour все работает при Value <>"" что совсем мне непонятно Это проверено на простой тестовой таблице - просто заполнил в первом столбце несколько ячеек не подряд Кроме этого vba спокойно глотает наличие чисел в части ячеек, Harbour падает в ошибку.
|
 |

|
|
| постоянный участник
|
Пост N: 1404
Зарегистрирован: 09.10.06
|
|
Отправлено: 28.01.17 18:14. Заголовок: За такой перевод пер..
За такой перевод переводчик от технического редактора по рукам может получить Ближе к теме: вспоминайте, для чего предназначена функция Empty в hb, и countA в vba, а также посмотрите пример от MVP Dennis Wallentin в топике Range.Row Property (Excel) Sub Delete_Empty_Rows() 'This example deletes the empty rows from a selected range.
|
 |

|
|
| |
Пост N: 18
Зарегистрирован: 22.09.13
|
|
Отправлено: 28.01.17 19:24. Заголовок: Петр пишет: вспомин..
Петр пишет: цитата: | вспоминайте, для чего предназначена функция Empty |
| Спасибо! С Empty действительно все хорошо, но все же был интерес перевода готового примера в Harbour. Переведенный пример вполне рабочий (при текстовых заполнениях ячеек), но так и непонятно почему в Harbour все срабатывает при oExcel:Rows(r):Columns(1):Value <>"", может разъясните где логика порылась... А то как-то неспокойно
|
 |

|
|
| постоянный участник
|
Пост N: 1405
Зарегистрирован: 09.10.06
|
|
Отправлено: 28.01.17 20:05. Заголовок: fokinal21 пишет: но..
fokinal21 пишет: цитата: | но все же был интерес перевода готового примера в Harbour |
| Ну так переводите, только учтите, что при переводе Шекспира на русский используются правила русского языка. А при переводе этого примера на Harbour правильно было бы учитывать особенности vba, Excell и Harbour, а не только . на : поменять. цитата: | procedure main ? "" = "" ? "" = NIL ? "" <> "" ? "" <> NIL ? "" = 0 |
|
|
 |

|
|
| |
Пост N: 116
Зарегистрирован: 09.09.11
|
|
Отправлено: 07.02.17 07:36. Заголовок: Добрый день, коллеги..
Добрый день, коллеги Имеется файл с иерархической структурой строк, как определить уровень иерархии по строке. Пробовал такое: RowLevel=oSheet:Outline:ShowLevels RowLevels RowLevel=oAs:Row(Ni):Outline:RowLevels
|
 |

|
|
| |
Пост N: 117
Зарегистрирован: 09.09.11
|
|
Отправлено: 07.02.17 09:43. Заголовок: Решил: RowLevel=oShe..
Решил: RowLevel=oSheet:Rows(Ni):OutlineLevel
|
 |

|
|
| |
Пост N: 350
Зарегистрирован: 03.12.08
|
|
Отправлено: 11.04.17 22:28. Заголовок: Читаем / пишем .XLSX..
|
 |

|
|
| |
Пост N: 20
Зарегистрирован: 22.09.13
|
|
Отправлено: 15.04.17 19:42. Заголовок: Всем добрый вечер! К..
Всем добрый вечер! Кусок кода: oExcel:=CreateObject( "Excel.Application" ) ? oExcel:hWnd oExcel:Quit() ? oExcel:hWnd В результате выводятся одинаковые значения. Почему, если Excel закрыт? Тоже самое происходит, если открыть файл и закрыть его вручную вместо Quit
|
 |

|
|
| moderator
|
Пост N: 1086
Зарегистрирован: 20.02.11
|
|
Отправлено: 15.04.17 20:25. Заголовок: fokinal21 пишет: По..
fokinal21 пишет: Потому что хендл окна присваиваивается при создании объекта и нет необходимости его актуализировать во время жизни объекта, т. к. это уже забота программиста. Еcли нужно что то с чемто сравнить, то нужно и проверить живо ли еще окно с таки хендлом
|
 |

|
|
| |
Пост N: 21
Зарегистрирован: 22.09.13
|
|
Отправлено: 15.04.17 21:27. Заголовок: Haz пишет: Потому ч..
Haz пишет: цитата: | Потому что хендл окна присваиваивается при создании объекта и нет необходимости его актуализировать во время жизни объекта |
| Получается, что после Quit объект еще не умер? Если закрыть окно "крестиком" - тот же результат. Haz пишет: цитата: | проверить живо ли еще окно с таки хендлом |
| А как проверить? Этот результат появился после танцев вокруг поиска способа именно такой проверки.
|
 |

|
|
| |
Пост N: 6360
Зарегистрирован: 17.05.05
|
|
Отправлено: 15.04.17 21:28. Заголовок: fokinal21 пишет: oE..
fokinal21 пишет: я после этого делаю так oWorkBook:=nil oSheet:=nil oExcel:=nil
|
 |

|
|
| moderator
|
Пост N: 1087
Зарегистрирован: 20.02.11
|
|
Отправлено: 15.04.17 22:35. Заголовок: fokinal21 пишет: А ..
fokinal21 пишет: Ну есть к примеру enumwindows которая возвращает список активных окон в системе. Возможно есть способ проще, типа похендлу получить статус окна... именно живо ли оно
|
 |

|
|
| постоянный участник
|
Пост N: 1441
Зарегистрирован: 09.10.06
|
|
Отправлено: 15.04.17 23:47. Заголовок: Haz пишет: Возможн..
Haz пишет: цитата: | Возможно есть способ проще, типа похендлу получить статус окна |
| Валидность хэндла обычно проверяют с использованием WinAPI функции IsWindow() В MiniGUI функция-враппер носит название IsWindowHandle(). if IsWindowHandle( oExcel:hWnd ) ...
|
 |

|
|
| |
Пост N: 22
Зарегистрирован: 22.09.13
|
|
Отправлено: 16.04.17 11:19. Заголовок: oExcel ..
oExcel :=CreateObject( "Excel.Application" ) hWnd:=oExcel:hWnd ? hWnd ? IsWindowHandle(hWnd) // Результаты: 462230 и .T. oExcel:Quit() ? hWnd ? IsWindowHandle(hWnd) // Результаты: 462230 и .T. *По рекомендации Dima oExcel:=nil ? hWnd ? IsWindowHandle(hWnd) // Результаты: 462230 и .T. // Итог: oExcel опять живее всех живых, несмотря на oExcel:Quit() и oExcel:=nil
|
 |

|
|
| |
Пост N: 6361
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.04.17 12:22. Заголовок: fokinal21 пишет: *П..
fokinal21 пишет: цитата: | *По рекомендации Dima oExcel:=nil ? hWnd ? IsWindowHandle(hWnd) // Результаты: 462230 и .T. // Итог: oExcel опять живее всех живых, несмотря на oExcel:Quit() и oExcel:=nil |
| Ну тогда нужно так oExcel:Quit() oExcel:=nil ? hWnd:=oExcel:hWnd ? IsWindowHandle(hWnd) // Итог: результат в студию
|
 |

|
|
| |
Пост N: 523
Зарегистрирован: 08.07.06
|
|
Отправлено: 16.04.17 12:33. Заголовок: Dima пишет: oExcel:..
Dima пишет: цитата: | oExcel:Quit() oExcel:=nil ? hWnd:=oExcel:hWnd ? IsWindowHandle(hWnd) // Итог: результат в студию |
| Можно даже не компилировать - результатом будет ошибка времени исполнения, тк у переменной типа NIL не может быть свойства :hWnd А ноги у этой проблемы вот отсюда растут: http://clipper.borda.ru/?1-4-0-00001096-000-0-0-1440920410 Вот тут тоже обсуждали: http://clipper.borda.ru/?1-4-0-00000591-000-0-0-1317808661 Вот решение: http://clipper.borda.ru/?1-4-0-00000876-000-0-0-1373554002 func Start_Excel() Local Res:=.f. #ifndef __XHARBOUR__ #xcommand TRY => BEGIN SEQUENCE WITH {|e| Break( e )} #xcommand CATCH [<!oErr!>] => RECOVER [USING <oErr>] <-oErr-> #endif TRY oExcel := GetActiveObject( "Excel.Application" ) oExcel:DisplayAlerts:=.f. Res:=.t. CATCH Res:=.f. TRY oExcel := CreateObject( "Excel.Application" ) Res:=.t. CATCH Res:=.f. END END Return Res Т.е. если процесс уже есть в памяти - использовать его, а не создавать новый.
|
 |

|
|
| |
Пост N: 23
Зарегистрирован: 22.09.13
|
|
Отправлено: 16.04.17 16:36. Заголовок: В общем понятно, что..
В общем понятно, что процесс Excel закрывается только после закрытия вызвавшей его программы, как ни крути Quit - ами и nil - ами. И это значит, что попытки выяснить с помощью хендла закрыл юзер окно с табличкой или нет обречены на провал, а это и надо было мне сделать. Может кто проведет другим путем?
|
 |

|
|
| |
Пост N: 6364
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.04.17 16:43. Заголовок: fokinal21 пишет: эт..
fokinal21 пишет: цитата: | это значит, что попытки выяснить с помощью хендла закрыл юзер окно с табличкой или нет обречены на провал |
| А зачем это контролировать ? Выбросил форму в Excel а дальше юзер что хочет с ней то и делает. У себя делаю примерно так: oExcel:DisplayAlerts:=.t. oExcel:Visible := .t. oSheet:Cells( 1, 1 ):select() //oSheet:Protect( "blabla" ) Showexcel(oExcel)
|
 |

|
|
| moderator
|
Пост N: 1088
Зарегистрирован: 20.02.11
|
|
Отправлено: 16.04.17 18:42. Заголовок: fokinal21 пишет: Мо..
fokinal21 пишет: цитата: | Может кто проведет другим путем? |
| Да легко Суть в том что любое окно порождено конкретным процессом. Отслеживать хендл окна дело бесперспективное т. к. Винда использует повторное пернназначение (хендл закрытого окна может пллучтьб вновь созданное) Поэтому имеет смысл привязыватьсяименно к процессу еоторый это окно родил. И задача сводится к тому что бы определить жив ли сам процесс. Как определить? По алгоритму 1.зная окно можно найти процесс который его создал 2.зная процесс получить программу которая в нем выполняетя 3.и если это тот процесс и та программа то юзер ее еще не убил Ps в харбуре есть инструмент чтоб этот алгоритм проверить Будут вопросы пиши. На чтото я смогу ответить на что-то коллеги помогут
|
 |

|
|
| |
Пост N: 24
Зарегистрирован: 22.09.13
|
|
Отправлено: 17.04.17 09:49. Заголовок: Haz пишет: Как опр..
Haz пишет: цитата: | Как определить? По алгоритму 1.зная окно можно найти процесс который его создал 2.зная процесс получить программу которая в нем выполняетя 3.и если это тот процесс и та программа то юзер ее еще не убил |
| Пока на все один большой вопрос ? Чтобы превратить его в несколько маленьких ,стремящихся к 0, можно чуть подробнее и небольшой пример, можно ссылку, если таковой уже есть.
|
 |

|
|
| постоянный участник
|
Пост N: 1443
Зарегистрирован: 09.10.06
|
|
Отправлено: 17.04.17 11:58. Заголовок: fokinal21 пишет: По..
fokinal21 пишет: цитата: | Пока на все один большой вопрос ? Чтобы превратить его в несколько маленьких ,стремящихся к 0, можно чуть подробнее и небольшой пример, можно ссылку, если таковой уже есть. |
| Зачем это все прикладному программисту? fokinal21 пишет: цитата: | В общем понятно, что процесс Excel закрывается только после закрытия вызвавшей его программы, как ни крути Quit - ами и nil - ами. И это значит, что попытки выяснить с помощью хендла закрыл юзер окно с табличкой или нет обречены на провал, а это и надо было мне сделать. Может кто проведет другим путем? |
| oExсel:hWnd хранит хэндл главного окна oExсel (с классом 'XLMAIN'), как вы его собираетесь использовать для определения окна с табличкой, это еще вопрос. oExсel также имеет коллекцию Windows - "that represents all the windows in all the workbooks", вот я б с ней пробовал работать в вашей ситуации.
|
 |

|
|
| moderator
|
Пост N: 1089
Зарегистрирован: 20.02.11
|
|
Отправлено: 18.04.17 11:13. Заголовок: fokinal21 пишет: По..
fokinal21 пишет: цитата: | Пока на все один большой вопрос ? Чтобы превратить его в несколько маленьких ,стремящихся к 0, можно чуть подробнее и небольшой пример, можно ссылку, если таковой уже есть. |
| Вот тот самый небольшой пример. Показывает окна их класс и заголовки. В том числе если есть открытая книга в Excel то ее и покажет в списке #include "common.ch" #include "i_winuser.ch" #define WM_GETTEXT 0x000D #define WM_SETTEXT 0x000C #define WM_GETTEXTLENGTH 0x000E Func main() local hWnd := 0 local aWin := {} local aChild := {} local hChildWindow := 0 local i := 0 local j := 0 local nLen := 0 local nLenCh := 0 REQUEST HB_LANG_RU866 HB_LANGSELECT("RU866") REQUEST HB_CODEPAGE_RU1251 hb_cdpSelect( "RU1251" ) aWin := EnumWindows() nLen := len( aWin ) for i := 1 to nLen aChild := EnumChild( aWin[ i ] ) nLenCh := LEN( aChild ) for j := 1 TO nLenCh ? aChild[j][2], aChild[ j ][3] end end return NIL Func EnumChild( hWin ) local aChild := {} EnumChildWindows( hWin, { |hChild, nLParam | AADD( aChild, { hChild, GetClassName( hChild ), GetChildWindowText(hChild) } ) , .T. }, 0 ) return aChild FUNCTION GetChildWindowText(hWnd ) LOCAL nLen, cText nLen := SendMessage(hWnd, WM_GETTEXTLENGTH, 0, 0) + 1 cText := Space( nLen) nLen := SendMessageString(hWnd, WM_GETTEXT, nLen, @cText) RETURN substr(cText,1,nLen) ********************************************************************************************************************************************** * ********************************************************************************************************************************************** #pragma BEGINDUMP #include <windows.h> #include "hbapi.h" #include "hbapiitm.h" #include <hbapi.h> #include <hbapiitm.h> #include <windows.h> void hb_evalBlock( PHB_ITEM pCodeBlock, ... ); static PHB_ITEM pCodeBlock = NULL; BOOL CALLBACK static EnumChildProc( HWND hWnd, LPARAM lParam ) { PHB_ITEM pHWnd = hb_itemPutNL( NULL, ( LONG ) hWnd ); PHB_ITEM pParam = hb_itemPutNL( NULL, ( LONG ) lParam ); if( pCodeBlock ) hb_evalBlock( pCodeBlock, pHWnd, pParam, 0 ); hb_itemRelease( pHWnd ); hb_itemRelease( pParam ); return hb_parl( -1 ); } HB_FUNC( ENUMCHILDWINDOWS ) { HWND hWnd = ( HWND ) hb_parnl( 1 ); LPARAM lParam = ( LPARAM ) hb_parnl( 3 ); pCodeBlock = hb_param( 2, HB_IT_BLOCK ); hb_retl( EnumChildWindows( hWnd, EnumChildProc, lParam ) ); pCodeBlock = NULL; } BOOL CALLBACK static EnumWinProc( HWND hWnd, LPARAM lParam ) { PHB_ITEM pHWnd = hb_itemPutNL( NULL, ( LONG ) hWnd ); PHB_ITEM pParam = hb_itemPutNL( NULL, ( LONG ) lParam ); if( pCodeBlock ) hb_evalBlock( pCodeBlock, pHWnd, pParam, 0 ); hb_itemRelease( pHWnd ); hb_itemRelease( pParam ); return TRUE; } static PHB_ITEM pArray; #if defined( __BORLANDC__ ) #pragma argsused #endif BOOL CALLBACK EnumWindowsProc( HWND hWnd, LPARAM lParam ) { PHB_ITEM pHWnd = hb_itemPutNL( NULL, ( LONG ) hWnd ); #if defined( __MINGW32__ ) UNREFERENCED_PARAMETER( lParam ); #endif hb_arrayAddForward( pArray, pHWnd ); hb_itemRelease( pHWnd ); return TRUE; } HB_FUNC ( ENUMWINDOWS ) { pArray = hb_itemArrayNew( 0 ); EnumWindows( ( WNDENUMPROC ) EnumWindowsProc, ( LPARAM ) 0 ); hb_itemReturnRelease( pArray ); pArray = NULL; } BOOL CALLBACK EnumThreadWndProc( HWND hWnd, LPARAM lParam ) { PHB_ITEM pHWnd = hb_itemPutNL( NULL, ( LONG ) hWnd ); #if defined( __MINGW32__ ) UNREFERENCED_PARAMETER( lParam ); #endif hb_arrayAddForward( pArray, pHWnd ); hb_itemRelease( pHWnd ); return TRUE; } HB_FUNC ( GETCLASSNAME ) { HWND hWnd = (HWND) hb_parnl( 1 ); TCHAR ClassName[ 1024 ]; GetClassName( hWnd, ClassName, sizeof (ClassName) / sizeof (TCHAR) ); hb_retc( ClassName ); } HB_FUNC( GETWINDOWTEXT ) { HWND hWnd = ( HWND ) hb_parnl( 1 ); int iLen = GetWindowTextLength( hWnd ); char * cText = ( char * ) hb_xgrab( iLen + 1 ); int iRet = GetWindowText( hWnd, ( LPSTR ) cText, iLen + 1 ); hb_retclen( cText, iRet ); hb_xfree( cText ); } HB_FUNC( SENDMESSAGE ) { hb_retnl( ( LONG ) SendMessage( ( HWND ) hb_parnl( 1 ), ( UINT ) hb_parni( 2 ), ( WPARAM ) hb_parnl( 3 ), ( LPARAM ) hb_parnl( 4 ) ) ); } HB_FUNC( SENDMESSAGESTRING ) { hb_retnl( ( LONG ) SendMessage( ( HWND ) hb_parnl( 1 ), ( UINT ) hb_parni( 2 ), ( WPARAM ) hb_parnl( 3 ), ( LPARAM ) ( LPSTR ) hb_parc( 4 ) ) ); } HB_FUNC ( POSTMESSAGE ) { hb_retl( (BOOL) PostMessage ( (HWND) hb_parnl (1), (UINT) hb_parni (2), (WPARAM) hb_parnl (3), (LPARAM) hb_parnl (4) ) ); } #pragma ENDDUMP
|
 |

|
|
| |
Пост N: 25
Зарегистрирован: 22.09.13
|
|
Отправлено: 18.04.17 12:15. Заголовок: Всем спасибо за помо..
Всем спасибо за помощь и консультации! Haz пишет: цитата: | Вот тот самый небольшой пример |
| Буду, по возможности, разбираться с примером...
|
 |

|
|
| |
Пост N: 6368
Зарегистрирован: 17.05.05
|
|
Отправлено: 18.04.17 12:37. Заголовок: fokinal21 пишет: Бу..
fokinal21 пишет: цитата: | Буду, по возможности, разбираться с примером... |
| Пример по ходу отображается не верно , там где есть [ i ] только без пробелов внутри скобок
|
 |

|
|
| |
Пост N: 1410
Зарегистрирован: 17.02.12
|
|
Отправлено: 18.04.17 12:42. Заголовок: Dima пишет Пример по..
Dima пишет цитата: | Пример по ходу отображается не верно |
| тут for i := 1 to nLen aChild := EnumChild( aWin[ i ] ) nLenCh := LEN( aChild ) for j := 1 TO nLenCh ? aChild[j][2], aChild[j][3] end end
|
 |

|
|
| moderator
|
Пост N: 1090
Зарегистрирован: 20.02.11
|
|
Отправлено: 18.04.17 13:36. Заголовок: SergKis пишет: тут ..
SergKis пишет: Дима , Сергей , спасибо . Подправил [ и ]
|
 |

|
|
| постоянный участник
|
Пост N: 1445
Зарегистрирован: 09.10.06
|
|
Отправлено: 18.04.17 15:48. Заголовок: REQUEST HB_LANG_RU8..
цитата: | REQUEST HB_LANG_RU866 REQUEST HB_CODEPAGE_RU1251 procedure Main( p, m ) local oExcel, oWorkBook, oWindows local nI, nCount, w hb_LangSelect( "RU866" ) hb_cdpSelect( "RU1251" ) hb_default( @p, "/" ) hb_default( @m, "/m" ) if hb_LeftEqI( p, "/g" ) .or. hb_LeftEqI( p, "-g" ) oExcel := win_oleGetActiveObject( "Excel.Application" ) elseif hb_LeftEqI( p, "/c" ) .or. hb_LeftEqI( p, "-c" ) oExcel := win_oleCreateObject( "Excel.Application" ) else ? Upper( __FILE__ ), '[/G|/C] [/M]' ? ' /C - Create new Excel object' ? ' /G - Get existing object' ? ' /M - Merge instances [by default]' ? '' endif if oExcel != NIL IF hb_LeftEqI( m, "/m" ) .or. hb_LeftEqI( m, "-m" ) oExcel:MergeInstances := .T. else oExcel:MergeInstances := .F. endif ? oExcel:hwnd ? '---------' oWindows := oExcel:Windows() oWorkBook := oExcel:WorkBooks:Add() nCount := oWindows:Count // Note that the active window is always Windows[1] oWindows[1]:Caption := "xl#win#" + hb_NtoS( nCount ) for each w in oWindows ? w:caption ? w:hwnd next oExcel:Visible := .T. //oExcel:Quit() else ? "Error: MS Excel not available. [" + win_oleErrorText() + "]" endif return |
| Программа консольная. Компилировать как-то так hbmk2 myexcel.prg -lhbwin Запускать myexcel /c /m myexcel /g myexcel /g myexcel /g Рекомендую посмотреть, проанализировать и сделать выводы Интересно будет посмотреть на результат для разных версий Excel P.S. Excel 2016 работает чудненько.
|
 |

|
|
| |
Пост N: 6372
Зарегистрирован: 17.05.05
|
|
Отправлено: 18.04.17 16:26. Заголовок: Петр пишет: P.S. Ex..
Петр пишет: цитата: | P.S. Excel 2016 работает чудненько. |
| На 2003 падает на oExcel:MergeInstances и закоментил пока , пересобрал , запустил с ключом /C и упал в цикле на ? w:hwnd
|
 |

|
|
| постоянный участник
|
Пост N: 1447
Зарегистрирован: 09.10.06
|
|
Отправлено: 18.04.17 16:38. Заголовок: Dima пишет: На 2003..
Dima пишет: цитата: | На 2003 падает на oExcel:MergeInstances |
| Настоящий Эксель начинается с 2013 Dima пишет: Припоминаю, что где-то мы уже это обсуждали, у Ворда свойство hwnd есть, у Экселя нет. В 2007(?) вроде уже есть.
|
 |

|
|
| |
Пост N: 6374
Зарегистрирован: 17.05.05
|
|
Отправлено: 18.04.17 21:21. Заголовок: Петр пишет: Настоящ..
Петр пишет: цитата: | Настоящий Эксель начинается с 2013 |
| Кажется в примере не хватает проверки перед его запуском на версию офиса , впрочем это уже обсуждали в одной из тем , так что кому надо тот сам и допилит. PS У многих еще стоит XP и далеко не SP3 , так что заюзать могут офис только ниже 2010
|
 |

|
|
| постоянный участник
|
Пост N: 1448
Зарегистрирован: 09.10.06
|
|
Отправлено: 18.04.17 22:12. Заголовок: Dima пишет: Кажется..
Dima пишет: цитата: | Кажется в примере не хватает проверки перед его запуском на версию офиса |
| Можно добавить в любом удобном месте ? oExcel:version И танцевать от результата Excel 2003 - 11.0 Excel 2007 - 12.0 Excel 2010 - 14.0 Excel 2013 - 15.0 Excel 2016 - 16.0
|
 |

|
|
| |
Пост N: 513
Зарегистрирован: 17.06.10
|
|
Отправлено: 02.06.17 11:25. Заголовок: Из своей проги откры..
Из своей проги открываю файл Excel. В этом файле есть кнопка которая активирует макрос. Макрос должен посылать сообщение - PostMessage(чего нибудь) моей проге и закрывть Excel. Не писал ли кто похожее ?
|
 |

|
|
| постоянный участник
|
Пост N: 1498
Зарегистрирован: 09.10.06
|
|
Отправлено: 02.06.17 14:57. Заголовок: fil пишет: Не писал..
fil пишет: цитата: | Не писал ли кто похожее ? |
| Не писал, но не вижу на каком этапе могут возникнуть трудности: нажать кнопку (выполнить макрос), послать сообщение, закрыть Excel? Добавляйте описание WinAPI функций, что-то типа цитата: | Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long |
| и вперед. UPD: наверное вам пригодится RegisterWindowMessage.
|
 |

|
|
| |
Пост N: 514
Зарегистрирован: 17.06.10
|
|
Отправлено: 02.06.17 15:13. Заголовок: Не писал, но не вижу..
цитата: | Не писал, но не вижу на каком этапе могут возникнуть трудности |
| Да ни на каком, написал уже. Думал, вдруг кто халяву подкинет
|
 |

|
|
| постоянный участник
|
Пост N: 1499
Зарегистрирован: 09.10.06
|
|
Отправлено: 02.06.17 15:17. Заголовок: fil пишет: Думал, ..
fil пишет: цитата: | Думал, вдруг кто халяву подкинет |
|
|
 |

|
|
| |
Пост N: 516
Зарегистрирован: 17.06.10
|
|
Отправлено: 05.06.17 18:58. Заголовок: Динамическая погрузка макросов
Можно ли программно подгрузить в книгу макрос из внешнего*.bas файла ?
|
 |

|
|
| |
Пост N: 6453
Зарегистрирован: 17.05.05
|
|
Отправлено: 17.06.17 09:16. Заголовок: Заполняю ячейку след..
Заполняю ячейку следующим значением hb_dtoc(Tmp123->data_z,"DD.MM.YYYY") NumberFormat для нее поставил "@" , вместо даты получил цифры. Глянул как в макросе делает Excel для даты , NumberFormat там "m/d/yyyy" , тоже вставил в проге но после этого оля упала. Какой вид NumberFormat нужно поставить что бы и оля не упала и дата корректно отобразилась ?
|
 |

|
|
| постоянный участник
|
Пост N: 1523
Зарегистрирован: 09.10.06
|
|
Отправлено: 17.06.17 10:13. Заголовок: Dima пишет: Заполня..
Dima пишет: цитата: | Заполняю ячейку следующим значением hb_dtoc(Tmp123->data_z,"DD.MM.YYYY") |
| Попробуйте заполнять так :Value := Date() :Value := hb_DateTime() :Value := Tmp123->data_z
|
 |

|
|
| |
Пост N: 6454
Зарегистрирован: 17.05.05
|
|
Отправлено: 17.06.17 12:14. Заголовок: Петр Дело в том что..
Петр Дело в том что есть универсальная функция (моя) , обрабатывает DBF таблицу и кидает ее в EXCEL. Данные таблицы заполняю не по ячейкам а по строкам. То есть Value я присваиваю массив (в данном случае) вида {"17.06.2017","ИВАНОВ",45123.10} Если после присвоения (или до) не делать NumberFormat , то все ровно. Но понадобилось в 3 -й колонке число бить по разрядам что бы получить 45 123.10 , если этого не сделать получаю 45123.1 Поэтому решил диапазону (RANGE) передать массив вида {"@","@","# ##0"+GET_SDECIMAL()+"00"} через NumberFormat , все сработало за исключением вывода строки в которой дата. Подмена "@" на "m/d/yyyy" приводит к падению оли. Сделал пока временное решение но пришлось отказаться от заполнения диапазона в NumberFormat и сделал по ячейкам в цикле , скорость немного конечно упадет. Массив теперь выглядит так {NIL,"@","# ##0"+GET_SDECIMAL()+"00"} а в цикле проверка стоит , если не NIL то работаем с NumberFormat
|
 |

|
|
| постоянный участник
|
Пост N: 1524
Зарегистрирован: 09.10.06
|
|
Отправлено: 17.06.17 13:30. Заголовок: Фрагмент кода oAS:..
Фрагмент кода oAS:Range( "A1:C1" ):Value := {"17.06.2017","ИВАНОВ",45123.10} oAS:Range( "A1:C1" ):NumberFormat := {"mm/dd/yyyy","@","# ##0,00"} oAS:Range( "A1:C1" ):Select() в Excell 2016 не приводит к падению Можно попробовать использовать (до или после) oAS:Columns( 3 ):NumberFormat.. или oAS:Range( "С3:C100" ):NumberFormat.. UPD. oAS:Range( "A1:C1" ):Value := {Date(),"ИВАНОВ",45123.10} - тоже работает как просили..
|
 |

|
|
| |
Пост N: 6455
Зарегистрирован: 17.05.05
|
|
Отправлено: 17.06.17 13:45. Заголовок: Петр пишет: в Excel..
Петр пишет: цитата: | в Excell 2016 не приводит к падению |
| Возможно , у меня Excel 2000 У юзверей стоит , поэтому и у себя держу такую версию.
|
 |

|
|
| |
Пост N: 118
Зарегистрирован: 09.09.11
|
|
Отправлено: 18.06.17 10:13. Заголовок: Добрый день, формиру..
Добрый день, формирую DBF файл и выводе в Excel использую NaumberFormat только где надо разделить разряды, убрать 0, перенос текста - пока все ОК (Excel 2010 - 2016)
|
 |

|
|
| Администратор
|
Пост N: 3566
Зарегистрирован: 23.05.05
|
|
Отправлено: 20.06.17 16:13. Заголовок: Как вариант: перед з..
Как вариант: перед заполнением таблицы по строкам можно установить NumberFormat для тех столбцов, для которых это надо, т.е: oSheet:Columns( nCol1 ):NumberFormat := cFormat1 .. oSheet:Columns( nColN ):NumberFormat := cFormatN а затем сделать цикл по строкам с их заполнением Если есть шапка таблицы, то после форматирования всего столбца NumberFormat для шапки можно очистить, или установить другой: oSheet:Rows('1'+':'+AllTrim(Str(nRow))):NumberFormat := ... С точки зрения оптимизации так будет лучше всего, т.к. число вызовов NumberFormat будет минимально.
|
 |

|
|
| |
Пост N: 6461
Зарегистрирован: 17.05.05
|
|
Отправлено: 20.06.17 16:32. Заголовок: Pasha пишет: Как ва..
Pasha пишет: цитата: | Как вариант: перед заполнением таблицы по строкам можно установить NumberFormat для тех столбцов, для которых это надо, т.е: |
|
|
 |

|
|
| Администратор
|
Пост N: 3568
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.06.17 14:54. Заголовок: Как уже отмечалось, ..
Как уже отмечалось, харбор не поддерживает создание двумерных массивов Variant, и из-за этого в Excel не получается присвоить значение диапазону ячеек, состоящему из нескольких строк. Приходится присваивать значение построчно, что намного медленнее. Или копировать диапазон через буфер обмена. Это быстро, но сносит форматирование, что тоже не всегда приемлемо. Написал функцию, которая позволяет это делать. Ссылка на функцию с примером: http://my-files.ru/n4n4id
|
 |

|
|
| |
Пост N: 6464
Зарегистрирован: 17.05.05
|
|
Отправлено: 21.06.17 15:04. Заголовок: Pasha пишет: Написа..
Pasha пишет: цитата: | Написал функцию, которая позволяет это делать. |
| Гениально , работает однако Спасибо !
|
 |

|
|
| |
Пост N: 44
Зарегистрирован: 18.06.15
|
|
Отправлено: 22.06.17 08:55. Заголовок: Dima пишет: Гениаль..
|
 |

|
|
| постоянный участник
|
Пост N: 1532
Зарегистрирован: 09.10.06
|
|
Отправлено: 22.06.17 09:05. Заголовок: Alex_Cher пишет: че..
Alex_Cher пишет: hbwin включена в проект?
|
 |

|
|
| |
Пост N: 6466
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.06.17 09:05. Заголовок: Alex_Cher пишет: че..
|
 |

|
|
| |
Пост N: 45
Зарегистрирован: 18.06.15
|
|
Отправлено: 22.06.17 09:49. Заголовок: ... дальше больше ..
|
 |

|
|
| постоянный участник
|
Пост N: 1533
Зарегистрирован: 09.10.06
|
|
Отправлено: 22.06.17 10:01. Заголовок: Alex_Cher пишет: ...
Alex_Cher пишет: Больше чего? В MiniGUI (последней версии) правите файл сборки call ..\..\..\batch\compile.bat _set2a /L hbwin %1 %2 %3 %4 %5 %6 %7 %8 %9 и спокойно компилируете.
|
 |

|
|
| Администратор
|
Пост N: 3569
Зарегистрирован: 23.05.05
|
|
Отправлено: 22.06.17 10:36. Заголовок: По поводу этого кода..
По поводу этого кода. Оригинальный фрагмент там совсем небольшой: создание двумерного массива, все остальное пришлось копировать из сырцов hbwin и xharbour, так как нужные функции там объявлены как static, и их не вызовешь. Как раз месяц назад в harbour dev list было обсуждение этого вопроса, и есть надежда, что поддержка таких массивов будет добавлена в hbwin. Тогда эта функция станет не нужна. Сейчас ее можно использовать для решения вполне конкретной и ограниченной задачи. Это что-то вроде заплатки.
|
 |

|
|
| Администратор
|
Пост N: 3573
Зарегистрирован: 23.05.05
|
|
Отправлено: 04.07.17 14:05. Заголовок: Pasha пишет: и есть..
Pasha пишет: цитата: | и есть надежда, что поддержка таких массивов будет добавлена в hbwin. Тогда эта функция станет не нужна. |
| Ну вот, все вопросы в dev list утрясены, и поддержка многомерных массивов Variant добавлена в Harbour. Пример для заполнения диапазона в Excel: // файл из contrib\hbwin #include "hbole.ch" local aSet[nRows, nColumns] // далее надо заполнить двумерный массив со значениями ячеек // и вызвать oRange:Value := __oleVariantNew( WIN_VT_VARIANT, aSet, nRows, nColunms )
|
 |

|
|
| |
Пост N: 6482
Зарегистрирован: 17.05.05
|
|
Отправлено: 04.07.17 16:49. Заголовок: Pasha пишет: Ну вот..
Pasha пишет: цитата: | Ну вот, все вопросы в dev list утрясены, и поддержка многомерных массивов Variant добавлена в Harbour. |
| Спасибо.
|
 |

|
|
| постоянный участник
|
Пост N: 723
Зарегистрирован: 13.10.05
|
|
Отправлено: 05.07.17 07:28. Заголовок: http://xlslib.source..
http://xlslib.sourceforge.net/index.php What is xlsLib? xlsLib is a multiplatform, a C/C++ library for dynamically generating Excel(TM) files (*.xls format). It allows the generation of these files directly without the need of other assistive software. xlsLib can be used: as a statically linked library. xlsLib can easily be integrated in any C/C++ project. As a dynamically linked library. The classic shared object scheme can be followed for using xlsLib. Последние обновления , кажется 14 годом.
|
 |

|
|
| постоянный участник
|
Пост N: 724
Зарегистрирован: 13.10.05
|
|
Отправлено: 06.07.17 12:42. Заголовок: Петр Может быть Вы..
Петр Может быть Вы обратили свое внимание на эту библиотеку. Цель - возможность работы с ней в Харбор/ MiniGui
|
 |

|
|
| постоянный участник
|
Пост N: 1542
Зарегистрирован: 09.10.06
|
|
Отправлено: 11.07.17 11:34. Заголовок: Vlad04 пишет: Може..
Vlad04 пишет: цитата: | Может быть Вы обратили свое внимание на эту библиотеку. Цель - возможность работы с ней в Харбор/ MiniGui |
| Честно говоря, я не вижу в этом никакого профита. Активное продвижение формата xls завершилось в 2003 году - 14 лет назад. К тому же, несмотря на заявления, xlsLib типичная C++ библиотека. Использование с harbour (C) возможно, но это довольно сомнительное удовольствие. В MiniGUI есть пример для работы с libxlsxwriter.dll (формат xlsx).
|
 |

|
|
| постоянный участник
|
Пост N: 725
Зарегистрирован: 13.10.05
|
|
Отправлено: 11.07.17 14:17. Заголовок: Петр Ок, формат не ..
Петр Ок, формат не критичен. К сожалению libxlsxwriter.dll имеет ряд ограничений - она не может читать или изменять существующие файлы! И , наверно, обязательно д.быть установлен Excel
|
 |

|
|
| постоянный участник
|
Пост N: 1543
Зарегистрирован: 09.10.06
|
|
Отправлено: 11.07.17 15:55. Заголовок: Vlad04 пишет: К сож..
Vlad04 пишет: цитата: | К сожалению libxlsxwriter.dll имеет ряд ограничений - она не может читать или изменять существующие файлы! |
|
То же самое можна сказать о xlsLib Vlad04 пишет: цитата: | И , наверно, обязательно д.быть установлен Excel |
|
Нет
|
 |

|
|
| |
Пост N: 106
Зарегистрирован: 13.06.12
|
|
Отправлено: 22.07.17 22:06. Заголовок: Петр пишет: В MiniG..
Петр пишет: цитата: | В MiniGUI есть пример для работы с libxlsxwriter.dll (формат xlsx). |
| Где лежит? Что-то не нахожу...
|
 |

|
|
| |
Пост N: 6509
Зарегистрирован: 17.05.05
|
|
Отправлено: 23.07.17 12:56. Заголовок: Панченко пишет: Где..
Панченко пишет: цитата: | Где лежит? Что-то не нахожу... |
| C:\MiniGUI\SAMPLES\Advanced\HbXlsxWriter\
|
 |

|
|
| |
Пост N: 107
Зарегистрирован: 13.06.12
|
|
Отправлено: 24.07.17 12:48. Заголовок: Dima Спасибо. Пере..
Dima Спасибо. Перешел на версию 17.06. Действительно, пример там и лежит :))
|
 |

|
|
| |
Пост N: 108
Зарегистрирован: 13.06.12
|
|
Отправлено: 29.07.17 19:23. Заголовок: Pasha пишет: все во..
Pasha пишет: цитата: | все вопросы в dev list утрясены, и поддержка многомерных массивов Variant добавлена в Harbour. ... oRange:Value := __oleVariantNew( WIN_VT_VARIANT, aSet, nRows, nColunms ) |
| Логичным был бы второй шаг - такое же быстрое заполнение массива значениями oRange:Value. Этот вопрос не поднимается?
|
 |

|
|
| Администратор
|
Пост N: 3575
Зарегистрирован: 23.05.05
|
|
Отправлено: 02.08.17 12:54. Заголовок: И до этих правок мож..
И до этих правок можно было считать в массив значение Range для диапазона ячеек. Только массив получался с перевернутыми размерностями: сначала столбец, потом строка. Теперь же в массив считываются значения диапазона как положено: [ <строка>, <столбец> ] Никаких дополнительных функций вызывать не надо, просто вызвать: aValues := oRange:Value
|
 |

|
|
| |
Пост N: 109
Зарегистрирован: 13.06.12
|
|
Отправлено: 03.08.17 17:28. Заголовок: to Pasha Спасибо...
to Pasha Спасибо.
|
 |

|
|
| постоянный участник
|
Пост N: 5844
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.04.18 15:32. Заголовок: Pasha пишет: Как уж..
Pasha пишет: цитата: | Как уже отмечалось, харбор не поддерживает создание двумерных массивов Variant, и из-за этого в Excel не получается присвоить значение диапазону ячеек, состоящему из нескольких строк. Приходится присваивать значение построчно, что намного медленнее. Или копировать диапазон через буфер обмена. Это быстро, но сносит форматирование, что тоже не всегда приемлемо. Написал функцию, которая позволяет это делать. Ссылка на функцию с примером: http://my-files.ru/n4n4id |
| Файл удалён. Можно его выложить заново ?
|
 |

|
|
| |
Пост N: 6821
Зарегистрирован: 17.05.05
|
|
Отправлено: 26.04.18 16:02. Заголовок: Andrey пишет: Файл ..
|
 |

|
|
| постоянный участник
|
Пост N: 5845
Зарегистрирован: 12.09.06
|
|
Отправлено: 26.04.18 16:32. Заголовок: Спасибо ! :sm36: ..
Спасибо !
|
 |

|
|
| moderator
|
Пост N: 1230
Зарегистрирован: 20.02.11
|
|
Отправлено: 26.04.18 23:10. Заголовок: Так оно Пашиными ста..
Так оно Пашиными стараниями уже давно в дистрибутиве харбура. Я пользуюсь без всяких дополнительных функций. Все родное, харбуровское. Или речь не о том?
|
 |

|
|
| постоянный участник
|
Пост N: 5849
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.04.18 07:28. Заголовок: Haz пишет: Я пользу..
Haz пишет: цитата: | Я пользуюсь без всяких дополнительных функций. Все родное, харбуровское. Или речь не о том? |
| А есть пример небольшой, демонстрирующий как этим пользоваться ?
|
 |

|
|
| постоянный участник
|
Пост N: 1408
Зарегистрирован: 27.01.07
|
|
Отправлено: 27.04.18 08:23. Заголовок: В файле по ссылке и ..
Andrey пишет: цитата: | А есть пример небольшой, демонстрирующий как этим пользоваться ? |
| В файле по ссылке и есть пример.
|
 |

|
|
| постоянный участник
|
Пост N: 5850
Зарегистрирован: 12.09.06
|
|
Отправлено: 27.04.18 08:44. Заголовок: Haz пишет: Я пользу..
Haz пишет: цитата: | Я пользуюсь без всяких дополнительных функций. Все родное, харбуровское. Или речь не о том? |
| Да я не понял тоже. В примере разве - всё родное, харбуровское ?
|
 |

|
|
| |
Пост N: 6822
Зарегистрирован: 17.05.05
|
|
Отправлено: 27.04.18 08:46. Заголовок: Andrey пишет: А ест..
Andrey пишет: цитата: | А есть пример небольшой, демонстрирующий как этим пользоваться ? |
| Пост N: 3573 в этой теме
|
 |

|
|
| |
Пост N: 587
Зарегистрирован: 17.06.10
|
|
Отправлено: 24.05.18 20:26. Заголовок: Есть переменная соде..
Есть переменная содержащая RTF структуру. Как вставить эту переменную в ячейку Excel не как текст, а как RTF ?
|
 |

|
|
| |
Пост N: 591
Зарегистрирован: 17.06.10
|
|
Отправлено: 09.06.18 16:38. Заголовок: Всем, привет ! Как ..
Всем, привет ! Как можно программно войти в ячейку. Т.е. как если дважды кликнуть на ячейке и войти в режим редактирования. (макрос делал)
|
 |

|
|
| |
Пост N: 6847
Зарегистрирован: 17.05.05
|
|
Отправлено: 11.06.18 10:03. Заголовок: fil пишет: программ..
fil пишет: цитата: | программно войти в ячейку |
| Может это ?
|
 |

|
|
| |
Пост N: 592
Зарегистрирован: 17.06.10
|
|
Отправлено: 11.06.18 12:27. Заголовок: Только этот метод бу..
Только этот метод будет работать ежели Excel уже визуализирован. А так вроде подходит :SetKeys({"F2"}) :Paste() :SetKeys({"RETURN"}) А то ежели сделать paste не входя в ячейку, текст из клипборда распределится по строкам. В общем вся фигня из за того, что мне в ячейку Excel надо положить форматный текст, а в value ячейки можно положить только текст без формата. Остается paste
|
 |

|
|
| постоянный участник
|
Пост N: 6026
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.09.18 12:37. Заголовок: Всем привет ! Перено..
Всем привет ! Переношу проект из HBOLE.LIB -> HBWIN.LIB Создаю экселовский файл из массива: // дата , л/счёт , код , .... aDim := { DATE(), "901010"+HB_NtoS(10+nLine), "001", .... } В HBOLE.LIB использовал: IF cType == "D" oSheet:Cells( nLine, nI ):SET( "NumberFormat", "@" ) Получалось так: При использовании HBWIN.LIB переделал код: IF cType == "D" oSheet:Cells( nLine, nI ):NumberFormat := '@' // текстовая ячейка И так получается: Как для HBWIN.LIB сделать шаблон даты 99.99.9999 ? 
|
 |

|
|
| |
Пост N: 6918
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.09.18 12:51. Заголовок: Andrey пишет: Как д..
Andrey пишет: цитата: | Как для HBWIN.LIB сделать шаблон даты 99.99.9999 ? |
| Сделать руками такой шаблон в Excel (c записью в макрос) и после смотреть что он туда нарисовал
|
 |

|
|
| |
Пост N: 53
Зарегистрирован: 07.06.08
|
|
Отправлено: 12.09.18 15:08. Заголовок: Чтобы дата корректно..
Чтобы дата корректно отображалась в Excel, нужно дату преобразовать в строку, откуда Excel знает, что на входе дата и в каком зашифрованном виде? Например, так oSheet:Cells( nLine, nI ):Value := If( ValType( xValue )=="D", DtoC( xValue ), If( ValType( xValue )=="N", xValue , ; If( ValType( xValue )=="L", If( xValue ,".T." ,".F." ), cValToChar( xValue ) ) ) )
|
 |

|
|
| moderator
|
Пост N: 1304
Зарегистрирован: 20.02.11
|
|
Отправлено: 12.09.18 20:37. Заголовок: Andrey пишет: Numbe..
Andrey пишет: Никаких проблем не испытываю при прямой записи даты в Excel. Единственное в hbwin пустую дату необходимо заменить на nil. Указание @ в нумберформате говорит, что следующие данные это строка. Может в этом проблема
|
 |

|
|
| постоянный участник
|
Пост N: 6028
Зарегистрирован: 12.09.06
|
|
Отправлено: 12.09.18 23:20. Заголовок: Haz пишет: Указание..
Haz пишет: цитата: | Указание @ в нумберформате говорит, что следующие данные это строка. Может в этом проблема |
| В HBOLE.LIB работало, в HBWIN.LIB - нет. Делаю следующее: aDim := { DATE()-nLine, "901010"+HB_NtoS(10+nLine), .... } FOR nI := 1 TO LEN(aDim) cType := VALTYPE(aDim[nI]) xValue := aDim[nI] oSheet:Cells( nLine, nI ):Value := xValue IF cType == "D" // преобразуем в текстовый формат //oSheet:Cells( nLine, nI ):NumberFormat := '@' // работает //xValue := StoD( DTOS(xValue) ) // for HBOLE - oSheet:Cells( nLine, nI ):SET( "NumberFormat", 'm/d/yy' ) // дата ячейка - было ранее oSheet:Cells( nLine, nI ):NumberFormat := 'm/d/yy' // дата ячейка - НЕ РАБОТАЕТ, вылет по ошибке ELSEIF cType == "N" .....
|
 |

|
|
| |
Пост N: 61
Зарегистрирован: 18.06.15
|
|
Отправлено: 14.09.18 10:17. Заголовок: Мужики, пособите ...
Мужики, пособите ... создаю Excel, необходимо закрепить верхнюю часть таблицы на экране - макрос выдает " ActiveWindow.FreezePanes = True " вставляю в MiniGUI в разных комбинациях не проходит ... что не так ?
|
 |

|
|
| |
Пост N: 6920
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.09.18 10:30. Заголовок: Alex_Cher Примерно ..
Alex_Cher Примерно так oExcel:Sheets():Select() oExcel:ActiveWindow:SplitRow := 11 // :SplitCol oExcel:ActiveWindow:FreezePanes := .t.
|
 |

|
|
| |
Пост N: 62
Зарегистрирован: 18.06.15
|
|
Отправлено: 14.09.18 12:12. Заголовок: Dima пишет: Примерн..
Dima пишет: Dima - спасибо большое все нарисовалось,.. удачи тебе и всех благ ....
|
 |

|
|
| Администратор
|
Пост N: 3796
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.09.18 13:05. Заголовок: В HBOLE.LIB работало..
|
 |

|
|
| |
Пост N: 6964
Зарегистрирован: 17.05.05
|
|
Отправлено: 01.11.18 12:50. Заголовок: Как правильно конвер..
Как правильно конвертнуть макрос под Harbour ? ExecuteExcel4Macro "SHOW.DETAIL(1,212,FALSE,,2)" Пробовал так oExcel:Application:ExecuteExcel4Macro("SHOW.DETAIL(1,212,FALSE,,2)") Не пашет Проехали (надо было свернуть группы) Сделал так oSheet:Outline:ShowLevels(1)
|
 |

|
|
| |
Пост N: 56
Зарегистрирован: 24.02.11
|
|
Отправлено: 21.12.18 08:38. Заголовок: Всем доброго дня! Во..
Всем доброго дня! Возник вот такой интересный вопрос. Более-менее полноценная работа с Excel подразумевает наличие на компьютере установленного офиса. В силу привычки (или упоротости, не знаю) пользуюсь портабельным офисом. Впрочем, это касается не только офиса, предпочитаю использовать портабельные версии нужного ПО, если они имеются. Собственно вопрос в том, можно ли в связке с харбором как-то использовать вместо установленного офиса портабельный?
|
 |

|
|
| Администратор
|
Пост N: 3817
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.12.18 09:15. Заголовок: У меня на работе как..
У меня на работе как раз не установлен MS Office (уже 7 лет обхожусь без него). Скачаю portable, посмотрю.
|
 |

|
|
| |
Пост N: 6987
Зарегистрирован: 17.05.05
|
|
Отправлено: 21.12.18 10:04. Заголовок: vvv пишет: Собствен..
vvv пишет: цитата: | Собственно вопрос в том, можно ли в связке с харбором как-то использовать вместо установленного офиса портабельный? |
| Не попробуешь , не узнаешь... Для начала проверь , будет ли создаваться OLE объект Excel
|
 |

|
|
| |
Пост N: 2164
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.12.18 11:43. Заголовок: vvv пишет схема раб..
|
 |

|
|
| |
Пост N: 57
Зарегистрирован: 24.02.11
|
|
Отправлено: 21.12.18 12:07. Заголовок: Dima пишет: Для нач..
Dima пишет: цитата: | Для начала проверь , будет ли создаваться OLE объект Excel |
| Похоже, не создается. Вот текст ошибки из примера "OLE" цитата: | --------------------- Internal Error Handling Information --------------------- Subsystem Call ....: TOleAuto System Code .......: -1 Default Status ....: .F. Description .......: CO_E_CLASSSTRING Operation .........: TOLEAUTO:NEW Involved File .....: Dos Error Code ....: 0 |
| SergKis пишет: цитата: | схема работы с xml должна работать |
| Не, xml не подходит. Суть работы в следующем: открыть xls файл (приходит со стороны), кое-что поменять и сохранить (с сохранением форматирования) под новым именем. В принципе, есть работающий костыль на Йокселе, но Йоксель рандомно затирает формулы и приходится постоянно контролировать результат. Иногда еще теряется формат ячеек, тоже рандомно. Причем потери возникают именно при открытии файла.
|
 |

|
|
| |
Пост N: 2165
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.12.18 12:38. Заголовок: vvv Если надо менят..
vvv Если надо менять и присутствуют формулы ..., зачем искать приключений с portable, йоксель, просто установите excel. Есть, конечно, LibXL (можно читать, писать и т.д.), но она платная
|
 |

|
|
| |
Пост N: 58
Зарегистрирован: 24.02.11
|
|
Отправлено: 21.12.18 12:57. Заголовок: Да сам не знаю, поче..
Да сам не знаю, почему ексель не хочется ставить. Может азарт какой "а можно ли без".
|
 |

|
|
| постоянный участник
|
Пост N: 1492
Зарегистрирован: 27.01.07
|
|
Отправлено: 21.12.18 13:11. Заголовок: Даже в Википедии нап..
Даже в Википедии написано, что цитата: | технология OLE использует архитектуру «толстого клиента», то есть сетевой ПК с избыточными вычислительными ресурсами. Это означает, что тип файла либо программа, которую пытаются внедрить, должна присутствовать на машине клиента. Например, если OLE оперирует таблицами Microsoft Excel, то программа Excel должна быть инсталлирована на машине пользователя |
| https://ru.wikipedia.org/wiki/Object_Linking_and_Embedding
|
 |

|
|
| |
Пост N: 59
Зарегистрирован: 24.02.11
|
|
Отправлено: 21.12.18 13:40. Заголовок: PSP пишет: Даже в В..
PSP пишет: цитата: | Даже в Википедии написано, что цитата: технология OLE использует архитектуру «толстого клиента», то есть сетевой ПК с избыточными вычислительными ресурсами. Это означает, что тип файла либо программа, которую пытаются внедрить, должна присутствовать на машине клиента. Например, если OLE оперирует таблицами Microsoft Excel, то программа Excel должна быть инсталлирована на машине пользователя |
| А вот здесь просто интересно, что вложено в данном конкретном случае в понятие "инсталлирована". Портабельный excel присутствует, но он "не инсталлирован", однако работает.
|
 |

|
|
| |
Пост N: 2166
Зарегистрирован: 17.02.12
|
|
Отправлено: 21.12.18 13:43. Заголовок: vvv пишет Может азар..
vvv пишет цитата: | Может азарт какой "а можно ли без" |
| В качестве фантазии\приключения (не пробовал) и азарта "а можно ли без". Вариант vba и макросов с назначением вып. макроса на клавишу Ctrl+Shift+... и попытки посылать из hb окну excel этих клавиш для выполнения нужного макроса (после run portable excel file.xls)
|
 |

|
|
| постоянный участник
|
Пост N: 1493
Зарегистрирован: 27.01.07
|
|
Отправлено: 21.12.18 13:45. Заголовок: vvv пишет: А вот зд..
vvv пишет: цитата: | А вот здесь просто интересно, что вложено в данном конкретном случае в понятие "инсталлирована". Портабельный excel присутствует, но он "не инсталлирован", однако работает. |
| По-моему, у понятия "инсталлирована" нет двойного смысла. Оно однозначно. "Неинсталлированный" excel работает сам по себе, но система о нем ничего не знает и поэтому не может создать экземпляр объекта на основании этого экселя.
|
 |

|
|
| |
Пост N: 60
Зарегистрирован: 24.02.11
|
|
Отправлено: 21.12.18 14:02. Заголовок: PSP пишет: "Неи..
PSP пишет: цитата: | "Неинсталлированный" excel работает сам по себе, но система о нем ничего не знает и поэтому не может создать экземпляр объекта на основании этого экселя. |
| Вот и хочется либо сообщить системе об этом екселе, либо, зная его месторасположение, использовать его мозги.
|
 |

|
|
| |
Пост N: 61
Зарегистрирован: 24.02.11
|
|
Отправлено: 21.12.18 14:04. Заголовок: SergKis пишет: В ка..
SergKis пишет: цитата: | В качестве фантазии\приключения (не пробовал) и азарта "а можно ли без". Вариант vba и макросов с назначением вып. макроса на клавишу Ctrl+Shift+... и попытки посылать из hb окну excel этих клавиш для выполнения нужного макроса (после run portable excel file.xls) |
| А можно попробовать в праздники, если делать нечего будет.
|
 |

|
|
| |
Пост N: 6988
Зарегистрирован: 17.05.05
|
|
Отправлено: 21.12.18 14:28. Заголовок: vvv пишет: А можно ..
vvv пишет: цитата: | А можно попробовать в праздники, если делать нечего будет. |
| Погугли на предмет Portable Excel Create Ole Object
|
 |

|
|
| Администратор
|
Пост N: 3818
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.12.18 16:49. Заголовок: Скачал portable offi..
|
 |

|
|
| |
Пост N: 6989
Зарегистрирован: 17.05.05
|
|
Отправлено: 21.12.18 17:45. Заголовок: Pasha Забей в поиск..
Pasha Забей в поиске на рутрекере лучше так "Portable Office 2003" Всего 12 ссылок
|
 |

|
|
| Администратор
|
Пост N: 3819
Зарегистрирован: 23.05.05
|
|
Отправлено: 21.12.18 18:17. Заголовок: Да я видел эти сборк..
Да я видел эти сборки, в комментариях пишут: на win10 не идет, а у меня как раз она. Автор сборок смотрю тот же
|
 |

|
|
| |
Пост N: 6990
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.12.18 00:01. Заголовок: Pasha Паш забей на ..
Pasha Паш забей на портабл , так как служба не загружена , ни чего не выйдет стандартными методами и придется выкручиваться.
|
 |

|
|
| постоянный участник
|
Пост N: 1494
Зарегистрирован: 27.01.07
|
|
Отправлено: 22.12.18 09:26. Заголовок: vvv пишет: Вот и хо..
vvv пишет: цитата: | Вот и хочется либо сообщить системе об этом екселе, либо, зная его месторасположение, использовать его мозги. |
| "Сообщить" системе можно очень просто: инсталлировать)) Всё остальное - фантазии. Это всё равно, что иметь автомобиль без мотора и думать, что автомобилю можно просто "сообщить", что мотор лежит в гараже и машина будет ехать только от этого "знания")))
|
 |

|
|
| |
Пост N: 6991
Зарегистрирован: 17.05.05
|
|
Отправлено: 22.12.18 09:46. Заголовок: По ходу можно пробну..
По ходу можно пробнуть , но не факт что сработает. Грузим Excel (portable) через hb_processOpen (например) После пробуем что то типа oExcel := GetActiveObject( "Excel.Application" ) 
|
 |

|
|
| moderator
|
Пост N: 1419
Зарегистрирован: 20.02.11
|
|
Отправлено: 22.12.18 14:05. Заголовок: Можно и не пробовать
Портабле приложения запускаются в своем окружении "песочнице" и этому приложению подсовывается наследие системы где его подготовили. А вовсе не наоборот. OLE точно работать не будет. VBA и макросы будут. Но об этом уже выше написано. Более того, если даже всю подготовку сделать, к примеру в xml, то система не будут иметь ассоциированного приложения с этим xml. Нужно руками запустить портабле ехель и руками открыть файл xml. Подобные приложения используются для работы в ручном режиме при угрозе влететь на лицензию. Для автоматизации они не годятся в привычном смысле. А для людей творческих, ничто не мешает из своей программы на харбуре запустить портабле ехель и дождавшись загрузки управлять ехелем нажимая на кнопки на его морде посылая соответствующие сообщения определенным окнам ехеля. Но это еще то шапито.
|
 |

|
|
| |
Пост N: 2167
Зарегистрирован: 17.02.12
|
|
Отправлено: 22.12.18 18:56. Заголовок: Haz пишет Подобные п..
Haz пишет цитата: | Подобные приложения используются для работы в ручном режиме при угрозе влететь на лицензию |
| Для работы одну лицензию можно приобрести, не ней проделывать манипуляции с документами через ole и раздавать для использования в portable excel на другие pc. Будет дешевле, во всех смыслах, чем "шапито"
|
 |

|
|
| moderator
|
Пост N: 1420
Зарегистрирован: 20.02.11
|
|
Отправлено: 22.12.18 21:55. Заголовок: SergKis пишет: Для ..
SergKis пишет: цитата: | Для работы одну лицензию можно приобрести, |
| Согласен, но это к заказчику. А у заказчика в голове мозг по другому работает.
|
 |

|
|
| постоянный участник
|
Пост N: 809
Зарегистрирован: 13.10.05
|
|
Отправлено: 10.03.19 21:13. Заголовок: Посмотрел примеры - ..
Посмотрел примеры - в основном выгрузка в Excel. У меня задача обратная - нужно прочесть данные с большого Excel файла (несколько десятков тысяч записей ). Размеры файла могут быть разные, т.е. не знаю сколько строк. Все читается через OLE, но очень долго, несколько минут. Как ускорить ?
|
 |

|
|
| |
Пост N: 7025
Зарегистрирован: 17.05.05
|
|
Отправлено: 10.03.19 21:57. Заголовок: Vlad04 Можно погугл..
Vlad04 Можно погуглить "чтение файла excel ole" А строки можно сразу посчитать
|
 |

|
|
| Администратор
|
Пост N: 3827
Зарегистрирован: 23.05.05
|
|
Отправлено: 11.03.19 08:07. Заголовок: Свойство Value относ..
Свойство Value относится к объекту Range. Можно присвоить Range диапазону ячеек внутри строки, и получить Value как массив. Можно получить значения сразу нескольких строк как двумерный массив.
|
 |

|
|
| постоянный участник
|
Пост N: 810
Зарегистрирован: 13.10.05
|
|
Отправлено: 11.03.19 15:26. Заголовок: Pasha Попробую пос..
Pasha Попробую построчно считывать. При записи подобным образом скорость кратно возрастает
|
 |

|
|
| moderator
|
Пост N: 1441
Зарегистрирован: 20.02.11
|
|
Отправлено: 11.03.19 17:33. Заголовок: Vlad04 пишет: нужно..
Vlad04 пишет: цитата: | нужно прочесть данные с большого Excel файла |
| Если это просто чья то выгрузка в Excel - читать можно через ODBC
|
 |

|
|
| постоянный участник
|
Пост N: 811
Зарегистрирован: 13.10.05
|
|
Отправлено: 11.03.19 21:39. Заголовок: Haz Выгрузка чья-то..
Haz Выгрузка чья-то, но формат определённый. Попробовал читать в массив - построчно быстрее,чем по клеточно - а если всю таблицу в массив, так вообще улёт, совсем немного отстает от DBF. Через ODBC, наверно, скорость будет как с родной таблицей ?
|
 |

|
|
| moderator
|
Пост N: 1442
Зарегистрирован: 20.02.11
|
|
Отправлено: 11.03.19 23:38. Заголовок: Vlad04 пишет: Через..
Vlad04 пишет: цитата: | Через ODBC, наверно, скорость будет как с родной таблицей ? |
| В принципе не тормозит. Где-то был пример чтения через ODBC, если сам не найдёшь, могу поискать у себя. Точно баловался лет 7 назад, тк была задача чтения и записи больших таблиц Excel.
|
 |

|
|
| постоянный участник
|
Пост N: 812
Зарегистрирован: 13.10.05
|
|
Отправлено: 12.03.19 19:20. Заголовок: Небольшой косочек ко..
Небольшой косочек кода решил выложить, так как с некоторыми моментами пришлось повозиться цитата: | ExcelApl - имя объекта Excel при открытии oAS := ExcelApl:ActiveSheet() Количество строк в Excel странице mlast := ExcelApl:ActiveSheet:Range("A1"):CurrentRegion:Rows:Count Копирование в переменную mCel (объявлена, как {}) необходимой области страницы Excel - 3 столбца на всю высоту.В столбцах числовые значения (2) и в одном - Дата. mCel:=oAS:Range('D'+Alltrim(Str(1,5))+':F'+Alltrim(Str(mlast,5))):Value Обработка nn:=2 for i:=2 to mlast // собственно данные со второй строки nWsrst:=(datTek - mCel[i,1] )/365.25 // в итоге число, исходное значение ДАТА nPOL:=Int(mCel[i,2] ) // число nSmk:= Int(mCel[i,3]) // число .... next i |
|
|
 |

|
|
| постоянный участник
|
Пост N: 813
Зарегистрирован: 13.10.05
|
|
Отправлено: 12.03.19 19:22. Заголовок: Формат исходного док..
Формат исходного документа csv и xls. Оффис 2003.
|
 |

|
|
| |
Пост N: 7026
Зарегистрирован: 17.05.05
|
|
Отправлено: 12.03.19 23:47. Заголовок: Vlad04 хз я считаю ..
Vlad04 хз я считаю строки и столбцы примерно так a:=oSheet:UsedRange:Rows:Count b:=oSheet:UsedRange:Columns:Count это после oWorkBook := oExcel:Workbooks:Open(cfile) oSheet := oExcel:ActiveSheet()
|
 |

|
|
| moderator
|
Пост N: 1443
Зарегистрирован: 20.02.11
|
|
Отправлено: 13.03.19 10:41. Заголовок: Vlad04 Через ODBC, ..
Vlad04 цитата: | Через ODBC, наверно, скорость будет как с родной таблицей |
| Попробуй этим , просто интересно Выгрузки в Excel где первая срока - имена полей а потом сам массив данных читает влет ODBCDemo.prg #require "rddsql" #require "sddodbc" #include "simpleio.ch" #include "dbinfo.ch" REQUEST SDDODBC, SQLMIX REQUEST HB_CODEPAGE_RU1251, HB_CODEPAGE_RU866 PROCEDURE Main() #if defined( __HBSCRIPT__HBSHELL ) rddRegister( "SQLBASE" ) rddRegister( "SQLMIX" ) hb_SDDODBC_Register() #endif Set( _SET_DATEFORMAT, "yyyy-mm-dd" ) HB_SETCODEPAGE( "RU1251" ) rddSetDefault( "SQLMIX" ) ? "Connect:", rddInfo( RDDI_CONNECT, { "ODBC", "Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=TEST.XLS;" } ) ? "Use:", dbUseArea( .T., , "select * from sheet1", "test" ) ? "Alias:", Alias() ? "DB struct:", hb_ValToExp( dbStruct() ) wait dbGoTop() Browse() dbCloseArea() RETURN Browse там для наглядности, обработку можно сделать в цикле while !eof() ... end, доступ к полям через fieldget( n ) свой XLS переименуй в TEST.XLS и кинь в папку с программой. ВАЖНО ярлычек с данными в EXL должен называться sheet1 или поправь в исходнике под свое название С MiniGui под консоль собирается так c:\MiniGui\batch\compile.bat ODBCDemo /l hbodbc /l odbc32 /l sddodbc /l hbsqldd /c %1 %2 %3 %4 %5 %6 %7 %8 %9
|
 |

|
|
| |
Пост N: 7138
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.11.19 11:59. Заголовок: Pasha пишет: В offi..
|
 |

|
|
| Администратор
|
Пост N: 3896
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.11.19 12:14. Заголовок: Я тоже не нашел обще..
Я тоже не нашел общего ответа, как решить элу проблему. Иногда эксель сходит с ума и начинает чудить. Из последних случаев: Эксель отказывался открывать определенный документ, по каким-то причинам считая его подозрительным Согласился открывать только после того, как я пересохранил документ именно этим экселем Другой случай: win_oleCreateObject("Excel.Application") на одном компьютере стал стабильно выдавать непонятную ошибку и сваливаться. Причем word там же работал без проблем Я уже собрался переустанавливать паршивца, когда заметил, что если Excel уже работает, открыт другой документ, то win_oleCreateObject тоже работает. Иногда не открывает файл из определенной папки, после копирования его в другую начинает открывать. Рекомендации по ссылке я тоже отрабатывал, не помогало Начиная с версии 2010 поганец сам решает, открывать ему файл или нет.
|
 |

|
|
| |
Пост N: 7139
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.11.19 13:52. Заголовок: Pasha пишет: Я тоже..
Pasha пишет: цитата: | Я тоже не нашел общего ответа, как решить элу проблему. |
| Я обнаружил один момент , писал выше. Если с тем же XLS файлом проделывать манипуляции по открытию его не важно из какой папки , минуя копирование по сети то все открывается нормально. Видать какой то атрибут цепляется к файлу после его копирования по сетке........вот его бы обнулить как то..
|
 |

|
|
| постоянный участник
|
Пост N: 1572
Зарегистрирован: 27.01.07
|
|
Отправлено: 14.11.19 15:36. Заголовок: http://winitpro.ru/i..
|
 |

|
|
| |
Пост N: 7140
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.11.19 17:28. Заголовок: PSP Пасиб за ссылку..
PSP Пасиб за ссылку. Что делать с этими атрибутами из Harbour не понятно.. Но посетила мысль , я взял файлик XLS по сети и сложил локально. Далее читаю его содержимое через hb_MemoRead , файлик локально убиваю и после пишу в файл с таким же именем через hb_memowrit По идее от этого атрибута и следа не останется 
|
 |

|
|
| moderator
|
Пост N: 1502
Зарегистрирован: 20.02.11
|
|
Отправлено: 14.11.19 17:52. Заголовок: Dima пишет: .вот ег..
Dima пишет: цитата: | .вот его бы обнулить как то.. |
| Попробуй так StrFile(FileStr(cFile ), cFile) создастся локальный файл PS Дим не заметил твое последнее с memowrit - по сути одно и тоже написали
|
 |

|
|
| |
Пост N: 7141
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.11.19 17:58. Заголовок: Haz пишет: по сути ..
Haz пишет: цитата: | по сути одно и тоже написали |
|  бывает
|
 |

|
|
| постоянный участник
|
Пост N: 1573
Зарегистрирован: 27.01.07
|
|
Отправлено: 14.11.19 19:56. Заголовок: Нормальный способ)) ..
Нормальный способ)) Костыль, конечно, но 100%-ый))
|
 |

|
|
| Администратор
|
Пост N: 3897
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.11.19 21:45. Заголовок: Вот описание работы ..
Вот описание работы с альтернативными потоками средствами winapi: https://habr.com/ru/post/46990/ Можно сделать обертку этих вызовов на харборе. Насколько я понял, для получения списка потоков файла надо использовать функцию NtQueryInformationFile. А для удаления потока подойдут и обычные файловые функции.
|
 |

|
|
| moderator
|
Пост N: 1503
Зарегистрирован: 20.02.11
|
|
Отправлено: 15.11.19 12:12. Заголовок: Dima пишет: его бы..
Dima пишет: Дим все оказалось просто; Ferase( cFile + ":Zone.Identifier") удаляет этот альтернативный поток не трогая сам файл. Более того стандартные файловые функции могут читать и писать в эти потоки.
|
 |

|
|
| Администратор
|
Пост N: 3898
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.11.19 16:15. Заголовок: Эти потоки - просто ..
Эти потоки - просто идеальное хранилище для вирусов. Интересно, антивирусы их проверяют ? Это не так тривиально, надо получить еще список потоков, а имена их могут быть разными
|
 |

|
|
| moderator
|
Пост N: 1504
Зарегистрирован: 20.02.11
|
|
Отправлено: 15.11.19 21:21. Заголовок: Pasha пишет: Это не..
Pasha пишет: цитата: | Это не так тривиально, надо получить еще |
| Да побаловался сегодня с ними. Держать там можно все что угодно. Можно протокол программы вести, можно dbf туда сунуть все, можно скрытые ресурсы. Из плюсов - все автоматом переезжает в другую папку при копировании и недоступно простому юзеру. Из минусов - только в ntfs, при удалении основного потока все это добро пропадает ( перекомпилил программу, заменил и привет) и стандартными способами получить список альтпотоков не удалась ( но это вопрос времени) В целом использовать можно, работают все файловые функции. Можно создать записать прочитать и удалить. Паша, спасибо за наводку. Ей уж лет 10 но узнал впервые Ps. Не знаю как на потоки отреагирует бекап. Скорее всего прозевает м это плохо, придётся перед бекапом их выводить из тени.
|
 |

|
Ответов - 202
, стр:
1
2
3
4
5
6
7
8
9
10
11
All
[только новые]
|
|