PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка (продолжение…)


Вопросы новичка (продолжение…)

Сообщений 601 страница 630 из 974

601

Я искал по словам связанным с этим и ничего не получил.

0

602

Спасибо Пётр как всегда.

0

603

Добрый день!
Подскажите, кокой командой можно перейти на следующую строчку в файле.

0

604

Это нужно?

Код:
File.s=OpenFileRequester("","","Текстовые файлы|*.txt|Все файлы|*.*",0)

If File
  
  If ReadFile(0, File)   ; if the file could be read, we continue...
    While Eof(0) = 0           ; loop as long the 'end of file' isn't reached
      Debug ReadString(0)      ; display line by line in the debug window
    Wend
    CloseFile(0)               ; close the previously opened file
  Else
    MessageRequester("Information","Не получилось открыть файл")
  EndIf
  
EndIf

0

605

Нет не то.Мне, например, надо записать в файл масив, я делаю так:
For i.c=1 To 10 Step 1
WriteString(1, st.s(i))
next i

В файле, например,  получается так:
1 2 3 4 5 6 7 8 9
А мне надо чтобы получилось так:
1
2
3
4
5
6
7
8
9

0

606

Нужно использовать функцию WriteStringN в место WriteString.

0

607

Спасибо! Всё получилось.
И ещё вопрос, мне например нужно загрузить двумерный массив из файла, в файле он представлен так:
1 2 3
4 5 6
7 8 9
Если не трудно, напишите как это сделать.

0

608

Здравствуйте, у меня проблема со структурой. Вот код:

Код:
Structure dua
  dua_actoid.s; актоид кластера
  Dim duacid.s(5,1); массив со всеми Дуацидами
EndStructure
nomer_duacid.l = 0; количество элементов для массива дуацидов (один элемент для одного кластера)
Global mas_duacid.dua(nomer_duacid); сам массив структур

При запуске выдаёт ошибку: a field a structure needs an explicit declared type

Если пишу вот так:

Код:
Structure dua
  dua_actoid.s; актоид кластера
  Array duacid.s(5,1); массив со всеми Дуацидами
EndStructure
nomer_duacid.l = 0; количество элементов для массива дуацидов (один элемент для одного кластера)
Global mas_duacid.dua(nomer_duacid); сам массив структур

При запуске выдаёт такую ошибку: Multi-dimension array are not supported inside structure

Это значит, нет вообще ни какого способо объявить многомерный массив внутри структуры?

А ещё вопрос, как сделать какой нибудь гаджет не видимым на форме?

0

609

goodwen написал(а):

Это значит, нет вообще ни какого способо объявить многомерный массив внутри структуры?

Статические массивы в структурах
Тут написано интересно

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

Статические массивы также имеют различный набор правил, которые учитывается при их использовании:

1). Как только статический массив определен, его внутренняя структура не может быть изменена.
2). Статические массивы (как структуры) не могут быть переопределены.
3). Они могут быть сделаны только из одного типа переменной (структурированного или стандартного типа переменной).
4). Размер массива ограничен только установленной оперативной памятью текущей машины.
5). У статических массивов может только быть одна размерность.
6). Они могут быть динамически определены, используя переменную или выражение, в которой задается размер
7). При определении размера , вы определите кол-во индексов и оно показывает реальный размер массива.
8). Статические массивы могут быть доступны только через структуру переменных, в которых они определены.

Скрыть гаджет

Код:
HideGadget(#Gadget, State)

0

610

goodwen написал(а):

Это значит, нет вообще ни какого способо объявить многомерный массив внутри структуры?

Ну почему же, можно создать еще одну структуру с массивом и тогда массив будет двухмерный.

Код:
Structure duacid
  Array a.s(1)
EndStructure

Structure dua
  dua_actoid.s; актоид кластера
  Array duacid.duacid(5); массив со всеми Дуацидами
EndStructure
nomer_duacid.l = 0; количество элементов для массива дуацидов (один элемент для одного кластера)
Global mas_duacid.dua
mas_duacid\duacid(2)\a(1) = ""

0

611

ВиниПур, Пётр благодарю.

0

612

Здравствуйте, У меня на форме editirgadget, мне нужно, чтобы на нём строки были разного цвета. Вот пример кода:

Код:
OpenWindow(1,200,300,300,300, "Окно", #PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget)
EditorGadget(2, 10, 20, 1020, 80)
    
      CompilerSelect #PB_Compiler_OS;условная компиляция, чтобы Api константы могли подставится для нужной ОС,
          CompilerCase #PB_OS_Windows; эти константы нужны для разрешения переноса по словам в EditorGadget
             SendMessage_(GadgetID(2),#EM_SETTARGETDEVICE, #Null, 0); разрешено для Windows и Linux
          CompilerCase #PB_OS_Linux
             gtk_text_view_set_wrap_mode_(GadgetID(2), #GTK_WRAP_NONE)
         CompilerEndSelect
         
         
         
         SetGadgetColor(2,#PB_Gadget_FrontColor,RGB(20,20,160)) ; Цвет текста
         SetGadgetText(2,GetGadgetText(2)+"Первая строка"+ Chr(13))
         
         SetGadgetColor(2,#PB_Gadget_FrontColor,RGB(200,20,0)) ; Цвет текста
         SetGadgetText(2,GetGadgetText(2)+"Вторая строка"+ Chr(13))
         
Repeat
event=WaitWindowEvent()
Until event=#PB_Event_CloseWindow

И цвет обоих строк всё равно один, который указан последним, а как сделать, чтобы для каждой строки определять свой цвет?

0

613

В КодАрхиве есть много требуемых примеров.
Вот один из них:

Код:
Structure CHARFORMAT2_ 
  cbSize.l 
  dwMask.l  
  dwEffects.l  
  yHeight.l  
  yOffset.l  
  crTextColor.l  
  bCharSet.b  
  bPitchAndFamily.b  
  szFaceName.b[#LF_FACESIZE]  
  _wPad2.w  
  wWeight.w  
  sSpacing.w  
  crBackColor.l  
  lcid.l  
  dwReserved.l  
  sStyle.w  
  wKerning.w  
  bUnderlineType.b  
  bAnimation.b  
  bRevAuthor.b  
  bReserved1.b 
EndStructure 

Procedure EditorBackColor(Gadget, Color.l) 
  format.CHARFORMAT2_ 
  format\cbSize = SizeOf(CHARFORMAT2_) 
  format\dwMask = $4000000  ; = #CFM_BACKCOLOR 
  format\crBackColor = Color 
  SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format) 
EndProcedure

Procedure EditorSelect(Gadget, LineStart.l, CharStart.l, LineEnd.l, CharEnd.l)    
  sel.CHARRANGE 
  sel\cpMin = SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, LineStart, 0) + CharStart - 1 
  
  If LineEnd = -1 
    LineEnd = SendMessage_(GadgetID(Gadget), #EM_GETLINECOUNT, 0, 0)-1 
  EndIf 
  sel\cpMax = SendMessage_(GadgetID(Gadget), #EM_LINEINDEX, LineEnd, 0) 
  
  If CharEnd = -1 
    sel\cpMax + SendMessage_(GadgetID(Gadget), #EM_LINELENGTH, sel\cpMax, 0) 
  Else 
    sel\cpMax + CharEnd - 1 
  EndIf 
  SendMessage_(GadgetID(Gadget), #EM_EXSETSEL, 0, @sel) 
EndProcedure 

; Set the Text color for the Selection 
; in RGB format 
Procedure EditorColor(Gadget, Color.l) 
  format.CHARFORMAT 
  format\cbSize = SizeOf(CHARFORMAT) 
  format\dwMask = #CFM_COLOR 
  format\crTextColor = Color 
  SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format) 
EndProcedure 

; Set Font Size for the Selection 
; in pt 
Procedure EditorFontSize(Gadget, Fontsize.l) 
  format.CHARFORMAT 
  format\cbSize = SizeOf(CHARFORMAT) 
  format\dwMask = #CFM_SIZE 
  format\yHeight = FontSize*20 
  SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format) 
EndProcedure 

; Set Font for the Selection 
; You must specify a font name, the font doesn't need 
; to be loaded 
Procedure EditorFont(Gadget, FontName.s) 
  format.CHARFORMAT 
  format\cbSize = SizeOf(CHARFORMAT) 
  format\dwMask = #CFM_FACE 
  PokeS(@format\szFaceName, FontName) 
  SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format) 
EndProcedure 

; Set Format of the Selection. This can be a combination of 
; the following values: 
; #CFM_BOLD 
; #CFM_ITALIC 
; #CFM_UNDERLINE 
; #CFM_STRIKEOUT 
Procedure EditorFormat(Gadget, Flags.l) 
  format.CHARFORMAT 
  format\cbSize = SizeOf(CHARFORMAT) 
  format\dwMask = #CFM_ITALIC|#CFM_BOLD|#CFM_STRIKEOUT|#CFM_UNDERLINE 
  format\dwEffects = Flags 
  SendMessage_(GadgetID(Gadget), #EM_SETCHARFORMAT, #SCF_SELECTION, @format) 
EndProcedure 


; ------------------------------------------------------------- 
; Source Example: 


;- Save *******
Procedure StreamFileOut_Callback(hFile, pbBuff, cb, pcb) 
  ProcedureReturn WriteFile_(hFile, pbBuff, cb, pcb, 0)!1 
EndProcedure 
 

; Hier eine Procedure + Callback zum speichern einer Datei: 
; 
; FileID freie ID fьr Dateioperationen 
; File Die Datei ggf. mit Pfad 
; Gadget Gadget ID vom EditorGadget() 

Procedure FileStreamOut(FileID.l, File.s, Gadget.l) 
 r.b=0
  Protected StreamData.EDITSTREAM 
  
  ;Wenn die Datei erzeugt werden kann, fortfahren.  
  If CreateFile(FileID, File) 
        
    ;Das Handle der Datei speichern 
    StreamData\dwCookie = FileID(FileID) 
    StreamData\dwError = #Null 
    
    ;Die Adresse der Callback Procedure speichern 
    StreamData\pfnCallback = @StreamFileOut_Callback() 
    
    ;Das RichEdit Control anweisen, den Stream zu aktivieren 
    SendMessage_(GadgetID(Gadget), #EM_STREAMOUT, #SF_RTF, @StreamData) 
    
    ;Datei schliessen 
    CloseFile(FileID) 
    r.b=1
  EndIf 
 ProcedureReturn r
EndProcedure


#Editor = 1 

If OpenWindow(0, 0, 0, 500, 500, "EditorGadget", #PB_Window_SystemMenu|#PB_Window_ScreenCentered) 
  If CreateGadgetList(WindowID(0)) 
    ButtonGadget(0,40,10,220,28,"Сохранить в файле и открыть в Ворде")
    EditorGadget(#Editor, 10, 50, 480, 430) 
    
    AddGadgetItem(#Editor, 0, "This is a blue, bold and underlined big text")      
    AddGadgetItem(#Editor, 1, "Times new Roman, red, striked out and italic")
    AddGadgetItem(#Editor, 2, "This is usual text, with a yellow background color")    
    AddGadgetItem(#Editor, 3, "This is usual Text.") 
    
    
    EditorSelect(#Editor, 0, 1, 0, -1)  ; select line 1 
      EditorColor(#Editor, RGB(0,0,255)) 
      EditorFontSize(#Editor, 18) 
      EditorFormat(#Editor, #CFM_UNDERLINE) 
      
    EditorSelect(#Editor, 1, 1, 1, -1)  ; select line 2 
      EditorColor(#Editor, RGB(255,0,0)) 
      EditorFont(#Editor, "Times New Roman") 
      EditorFormat(#Editor, #CFM_ITALIC|#CFM_STRIKEOUT) 

    EditorSelect(#Editor, 2, 1, 2, -1)  ; select line 2 
      EditorBackColor(#Editor, RGB(255,200,100)) 
      
    EditorSelect(#Editor, 0, 0, 0, 0)   ; select nothing again 

    
   Repeat 
     Event=WaitWindowEvent() 
     If Event=#PB_Event_Gadget
       If EventGadget()=0
         FileStreamOut(0, "Temp.rtf", 1)
         Delay(200)
         If FileSize("Temp.rtf")>0
           RunProgram("Temp.rtf")
         Else
           MessageRequester("", "Проблемы при создании файла!", #MB_OK|#MB_ICONERROR)
         EndIf
       EndIf
     EndIf
   Until Event = #PB_Event_CloseWindow 
  EndIf 
EndIf 

End

0

614

А можно ли из процедуры вывести несколько переменных? Или так, чтобы одним из входных параметров для процедуры было название массива, а процедура работала с самим массивом??

0

615

Тигрёнок написал(а):

А можно ли из процедуры вывести несколько переменных?

Можно.
Проще всего это сделать через структуру.

Код:
Structure Proba
   x.l
   y.l
   Text.s
EndStructure

test.Proba ; Объявление структуры

Procedure Test(*var.Proba)
  *var\x=1
  *var\y=2
 *var\Text="Текст"
EndProcedure

Test(@test) ; Вызываем процедуру и передаём ей указатель на структуру
; Отображаем в отладочном окне данные из структуры
Debug test\x
Debug test\y
Debug test\Text
Тигрёнок написал(а):

Или так, чтобы одним из входных параметров для процедуры было название массива, а процедура работала с самим массивом??

Это тоже возможно.

Код:
Procedure fill(Array B.l(1))  ; the 1 stays for the number of dimensions in the array
  length = ArraySize(B())
  For i = 0 To length
    B(i) = i
  Next i
EndProcedure

Dim A.l(10)
fill(A())  ; the array A() will be passed as parameter here

Debug A(5)
Debug A(10)

0

616

Подскажите, как определить сколько и какие буквы (c:\ d:\) винчестеров есть на компьютере?  :crazyfun:

0

617

Виталий написал(а):

Подскажите, как определить сколько и какие буквы (c:\ d:\) винчестеров есть на компьютере?

В примере List_ComputerDrives.pb есть такой код

Код:
Procedure GetAllDrives()

; create linked list to store drive name  
 Global NewList Drive.DriveInfos()

   ; Get all drives letter
   AllDrivesNames.s = Space(255)  ; AllDrivesNames receive string from GetLogicalDriveStrings API
   *AllDrivesNames.l = @AllDrivesNames 
   DrivesExist.l = GetLogicalDriveStrings_(255,*AllDrivesNames)
   NbOfDrives.b = 0
   If DrivesExist
      NbOfDrives = DrivesExist/4
      lpFileSystemNameBuffer.s = Space(255)

      For i.b = 1 To NbOfDrives
         AddElement(Drive())
         ;;-------- Drive letter
         ;; Drive()\Name have 3 chars : first the drive letter
         ;; second ":"
         ;; third  "\"                    

         Drive()\DriveLetter = UCase(PeekS(*AllDrivesNames,3))
         *AllDrivesNames + 4
         ;;-------- Volume name
         Drive()\NameOfVolume = ""

         GetVolumeInformation_(Drive()\DriveLetter,Drive()\NameOfVolume,255,0,0,0,lpFileSystemNameBuffer,255)
         If Len(Drive()\NameOfVolume)
             Drive()\NameOfVolume = UCase(Left(Drive()\NameOfVolume ,1)) + LCase(Mid(Drive()\NameOfVolume ,2,Len(Drive()\NameOfVolume)-1))
         Else
             Drive()\NameOfVolume = ""
         EndIf

; determine type of drive 
         Drive()\DriveType = GetDriveType_(@Drive()\DriveLetter)
         Select Drive()\DriveType

            Case 0  ; drive not determined
                 Drive()\DriveTypeString = "Indetermined Type"

            Case 1  ; 1	The root directory does not exist
                 Drive()\DriveTypeString = "Root directory does not exist"
      
            Case #DRIVE_REMOVABLE  ;The drive can be removed from the drive.
                 Drive()\DriveTypeString = "Floppy disk"

            Case #DRIVE_FIXED      ; The disk cannot be removed from the drive.
                 Drive()\DriveTypeString = "Not removed disk"

            Case #DRIVE_REMOTE     ; The drive is a remote (network) drive.
                 Drive()\DriveTypeString = "Remote (network) drive"

            Case #DRIVE_CDROM      ; The drive is a CD-ROM drive.
                 Drive()\DriveTypeString = "CD-ROM"

            Case #DRIVE_RAMDISK    ; The drive is a RAM disk.
                 Drive()\DriveTypeString = "RAM disk"
                 
            Default 
                 Drive()\DriveTypeString = "Indetermined Type"

         EndSelect
      Next i 
    EndIf

EndProcedure

0

618

SadStar, спасибо  :cool:
Только матюкается в строке - Global NewList Drive.DriveInfos(), на DriveInfos() - Говорит не найдено

И ещё как написать уделание одинаковых строк в файле. Часа 2 мучался не как не придумал

Отредактировано Виталий (28.10.2011 01:13:08)

0

619

Как вариант:
Загрузить все строки из файла в связанный список.
Скопировать строки в другой список проверяя чтобы не было совпадений.
Сохранить в файле строки из этого, другого списка.

0

620

Где можно почитать про подоюные функции - GetDriveType_ ?
В стандарном Хелпе такого нет

0

621

Виталий написал(а):

Где можно почитать про подоюные функции - GetDriveType_ ?

Нужно ввести имя функции в поисковике и как правило, первая же ссылка будет описанием http://msdn.microsoft.com/en-us/library … p/aa364939(v=vs.85).aspx

0

622

Пётр написал(а):

Нужно ввести имя функции в поисковике и как правило, первая же ссылка будет описанием http://msdn.microsoft.com/en-us/library … p/aa364939(v=vs.85).aspx

Может есть какойто help.CHM по функциям. А то хотелось бы почитать, про функции которых ещё не знаю.

0

623

Win32.zip

0

624

Дмитрий написал(а):

Win32.zip

Вот эту справку нужно распаковать (будут 3 файла) и скопировать в папку Help, PureBasic. Если такой папки нет, то ее нужно создать.
Тогда справка на WinAPI функцию будет вызываться по F1, что довольно удобно. Подробней здесь.

0

625

Пытаюсь написать плагин для программы rainmeter. Вот пример плагина на С++. Как сделать dllexport на purebasic?
Этот кусок
extern "C"
{
__declspec( dllexport ) UINT Initialize(HMODULE instance, LPCTSTR iniFile, LPCTSTR section, UINT id);
__declspec( dllexport ) void Finalize(HMODULE instance, UINT id);
__declspec( dllexport ) double Update2(UINT id);
__declspec( dllexport ) UINT GetPluginVersion();
__declspec( dllexport ) LPCTSTR GetPluginAuthor();
}

0

626

Нужно создать DLL?
Об этом можно прочитать здесь.

Должно быть примерно так:

Код:
ProcedureCDLL Initialize(instance, *iniFile, *section, id)
  
  
EndProcedure

ProcedureCDLL Finalize(instance, id)
  
  
EndProcedure

ProcedureCDLL.d Update2(id)
  
  
EndProcedure

ProcedureCDLL GetPluginVersion()
  
  
EndProcedure

ProcedureCDLL.s GetPluginAuthor()
  
  
EndProcedure

0

627

а вы не подскажете: как мне запихнуть картинку в массив.
(их будеть много)
---

Код:
dim images_my (16,16)
images(1,0)= ...
--...---
images(16,16)= ...

---
что бы я не загружал их а что бы они были в коде (images(x,x))

и один файл (*.exe) и все. :-)
(шась 1 - exe, 256 - images)

0

628

GGGraz примерно так

Код:
CatchImage(images_1, ?images_my1)
CatchImage(images_2, ?images_my2)
CatchImage(images_3, ?images_my3)
CatchImage(images_4, ?images_my4)
;....................
;все остальные имаджи
;....................
CatchImage(images_253, ?images_my253)
CatchImage(images_254, ?images_my254)
CatchImage(images_255, ?images_my255)
CatchImage(images_256, ?images_my256)

IncludePath "путь/до/папки/с/картинками"

DataSection
     images_my1:  IncludeBinary "Logo1.bmp"
     images_my2:  IncludeBinary "Logo2.bmp"
     images_my3:  IncludeBinary "Logo3.bmp"
     images_my4:  IncludeBinary "Logo4.bmp"
     ;.................................
     ;все остальные картинки
     ;.................................
     images_my253:  IncludeBinary "Logo253.bmp"
     images_my254:  IncludeBinary "Logo254.bmp"
     images_my255:  IncludeBinary "Logo255.bmp"
     images_my256:  IncludeBinary "Logo256.bmp"
EndDataSection

0

629

Если рисунков много, то их целесообразно запихнуть в один архив, который будет запихиваться в EXE и во время старта программы - распаковываться в память для использования рисунков.
В одном из моих проектов (рисунков было порядка 150) я так и поступил, что значительно упростило код программы и уменьшило размер EXE-файла за счет сжатия рисунков в архиве.
Для сжатия и распаковки можно использовать пару функций PackMemory() и UnpackMemory().

0

630

http://uploads.ru/t/B/u/X/BuX9q.png

Вот чего должно получится. Очень не хочется это видеть в отдельном файле (*.exe + *.png, *.jpg, *.gif) ;-)

(это игра)

я начал на VB5 там был image. Вот отсюдова вопрос - есть такой же в purebasic или нет.

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Вопросы новичка (продолжение…)