farbe eines objekts ändern

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

lomtas
**
Beiträge: 26
Registriert: Do, 10.03.2005 09:27
Kontaktdaten:

farbe eines objekts ändern

Beitrag von lomtas »

Ich denke, dass mein Vorhaben mit Basic möglich ist. Leider weiß ich nicht genau wie:

Ich möchte ein kleines Spiel für eine Silvesterfeier erstellen. Dabei sieht man am Anfang eine Übersicht, kann sich dann ein Gebiet aussuchen. Per Klick wird auf die Folie gewechselt. Hat man die Frage beantwortet / die Aktion erledigt (was auch immer) kommt man wieder zurück zur Übersicht. Hier soll nun die Farbe des Objekts eine andere sein, um zu erkennen, dass diese Frage / diese Aktion schon getätigt wurde.

Meine Idee war: Beim Folienstart der Übersicht wird ein Makro ausgeführt, was die (globalen) Variablen auf true oder false prüft. Je nach Wert wird die Hintergrundfarbe festgelegt. Beim Folienstart der Aktionen werden dann die globalen Variablen jeweils vom Wert her geändert. Ruft man nun wieder die Übersicht auf wird erneut das Makro ausgeführt, dass die Werte der globalen Variablen prüft und die Hintergrundfarben dementsprechend setzt.

Von der Idee her müsste das klappen, nur tauchen bei mir einige Fragen auf:
- Wie kann ich ein Makro beim Start einer Folie aufrufen?
- Wie kann ich mit Basic die Hintergrundfarbe eines Objekts ändern?
(gibt noch mehr, aber fangen wir erst mal damit an)

Vielen Dank für alle Hilfe.
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Iomtas,

hmm, ein paar zusätzliche Infos wären schön.

Was meist du mit "Folienstart"? Mit welchem Modul von OOo willst du dein Vorhaben eigentlich realisieren (Writer, Calc, Draw, Impress)?
Was verstehtst du unter "Objekten"? Texte? Grafische Objekte? Bilder?

Mit den Infos könnte man auch deine Fragen beantworten.

Viele Grüße
Thomas

PS: Sicher, dass OOo deine Wahl für diese Aufgabenstellung ist? Wäre nicht "Flash" hier angebrachter?
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
lomtas
**
Beiträge: 26
Registriert: Do, 10.03.2005 09:27
Kontaktdaten:

Beitrag von lomtas »

Sicher wäre Flash hier angebrachter, nur gebe ich dafür keine 1000 EUR aus :)

Also, ich möchte das mit Impress realisieren. Bei den Objekten handelt es sich um Rechtecke. Diese haben eine Hintergrundfarbe. Die Hintergrundfarbe soll sich ändern, sobald ein Rechteck geklickt wurde.

Reichen diese Zusatzinformationen? Gerne gebe ich noch mehr preis...
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Iomtas,

na ja, grundsätzlich gilt: je mehr Informationen, um so besser. Allerdings reichen die, um dir für dein "Rechteck" Problem Lösungsansätze zu liefern.

Zunächst solltest du alle Objekte (Rechtecke) "benennen" - wenn du sie manuell eingefügt hast, dann Objekt markieren, Kontextmenü -> Objekt benennen.
Dadurch lasssen sie sich später einfach per Code wiederfinden :-)
Also, angenommen dein Rechteck ist auf Folie 1 (Name: "Folie_1") und trägt den Namen "Rechteck_01", der folgende Code "färbt" das Rechteck rot:

Code: Alles auswählen

sub Rechteck_faerben
   oDoc = thisComponent  'dein Dokument
	opage = oDoc.drawPages.getByName("Folie_1") 'deine folie
	REM schleife über alle Objekte
	for i = 0 to oPage.count - 1
		oShape = oPage.getByIndex(i)
		if oShape.name = "Rechteck_01" then 
		   oRechteck = oShape  'Objekt gefunden
		   exit for
		end if
	next
	oRechteck.fillColor = rgb(255, 59, 0) 'Farbe zuweisen	
end sub
Die Problematik ist natürlich, dass du das "Objekt anklicken" als Event irgendwie realisieren musst. Typischerweise würde man hierfür ein Formular nutzen, und dort das mit Schaltflächen realisieren - entweder als Grafische Schaltflächen - dann könnte der Hintergrund auch "gefärbt" werden oder auch als Buttons. Da hättest du nämlich dein Ereignis direkt abrufbereit und könntest ein Makro damit verknüpfen.
Dann allerdings sieht dein Code anders aus - aber das ist eben ein ganz anderes Thema.

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
lomtas
**
Beiträge: 26
Registriert: Do, 10.03.2005 09:27
Kontaktdaten:

Beitrag von lomtas »

super, ich konnte damit eine menge anfangen. Leider habe ich noch ein Denkproblem. Mein Macro soll mit der Präsentation starten und dann als Programm mitlaufen. Ich setze zu beginn meines Makros meine Variablen und dann möchte ich mit ihnen arbeiten. Leider wird das Makro ausgeführt und beendet. Irgendwie gefällt mir das noch nicht. Mein Makro sieht bisher folgendermaßen aus:

Code: Alles auswählen

REM  *****  BASIC  *****

dim schalter(25) as boolean

Sub Main

Rechteck_faerben

End Sub

sub starten

schalter(0) = false
schalter(1) = false
schalter(2) = false
schalter(3) = false
schalter(4) = false
schalter(5) = false
schalter(6) = false
schalter(7) = false
schalter(8) = false
schalter(9) = false
schalter(10) = false
schalter(11) = false
schalter(12) = false
schalter(13) = false
schalter(14) = false
schalter(15) = false
schalter(16) = false
schalter(17) = false
schalter(18) = false
schalter(19) = false
schalter(20) = false
schalter(21) = false
schalter(22) = false
schalter(23) = false
schalter(24) = false

end sub

sub Rechteck_faerben
   dim button(25) as string
   button(0)="allgemein20"
   button(1)="allgemein40"
   button(2)="allgemein60"
   button(3)="allgemein80"
   button(4)="allgemein100"
   button(5)="silvester20"
   button(6)="silvester40"
   button(7)="silvester60"
   button(8)="silvester80"
   button(9)="silvester100"
   button(10)="bibel20"
   button(11)="bibel40"
   button(12)="bibel60"
   button(13)="bibel80"
   button(14)="bibel100"
   button(15)="fun20"
   button(16)="fun40"
   button(17)="fun60"
   button(18)="fun80"
   button(19)="fun100"
   button(20)="aktion20"
   button(21)="aktion21"
   button(22)="aktion22"
   button(23)="aktion23"
   button(24)="aktion24"

   oDoc = thisComponent  'dein Dokument
   oPage = oDoc.drawPages.getByName("uebersicht") 'deine folie
   REM schleife über alle Objekte
   for n = 0 to 24
	   for i = 0 to oPage.count - 1
	      oShape = oPage.getByIndex(i)
	      if oShape.name = "butt_"+button(n) then
	         oRechteck = oShape  'Objekt gefunden
	         exit for
	      end if
	   next
	   if(schalter(n)) then
		   oRechteck.fillColor = rgb(220, 35, 0) 'Farbe zuweisen   
	   else
		   oRechteck.fillColor = rgb(148, 189, 94) 'Farbe zuweisen   
	   end if
   next
end sub

sub setschalter0

schalter(0) = true

end sub
Das Problem ist, dass er sich den status der schalter nicht merkt. Außerdem ist die Funktion setschalter0 noch sehr suboptimal. Am besten wäre eine Funktion, die einen Parameter entgegennehmen könnte, aber irgendwie habe ich das über die Interaktion von Flächen nicht geschafft. (Ich nutze flächen als Buttons, die dann die Makros aufrufen).
Toxitom
********
Beiträge: 3769
Registriert: Di, 12.08.2003 18:07
Wohnort: Wiesbaden
Kontaktdaten:

Beitrag von Toxitom »

Hey Iomtas,
Mein Macro soll mit der Präsentation starten und dann als Programm mitlaufen.
Hmm, dazu müsstest du eine Endlosschlaiefe einbauen - mit Verzögerungen. so etwas wie

Code: Alles auswählen

 do
             ...<Code>
             wait(5000)   '5 Sekunden warten
            loop until <Endebedingung>
Wäre dennoch sehr schlechter Programmierstiel und beklastet die CPU enorm.

Also, ich würde das gesamte Konzept überdenken! Wie gesagt, Formulare wären eigentlich der richtige Weg. Hier hättest du einzelne Schaltflächen, die du genauso färben kannst, die Makros würden nur starten, wenn man auf die Fläche klickt, und du köntest dir "Schalter" sparen, da du ja die Farbeigenschaft jedes einzlenen Elementes direkt prüfen kanst und somit den Schaltzustand.

Im Übrigen ist mir bei deinem aktuellen Makro nicht klar, was genau du da tust. Wie rufst du das Makro auf? Wann startet dein Makro "starten"? Und - natürlich behält sich dein Makro jkeine Werte - wo den auch? Varaiblen sind nur so lange definiert, wie das Makro läuft bzw. die Bibliothek geladen ist, Startest du das Makro wieder, geht alles von vorne los, die Variablen werden neu initialisiert und haben natürlich keine "alten" werte mehr. Solache Sachen musst du - bei Bedarf - direkt im Dokument unterbringen (also quasi zwischenspeichern) und dort bei Bedarf wieder auslesen.

Viele Grüße
Thomas
Unterstützer LibreOffice, zertifizierter Trainer und Berater
Bücher: LibreOffice 6- Einstieg und Umstieg
Makros Grundlagen - LibreOffice / OpenOffice Basic
lomtas
**
Beiträge: 26
Registriert: Do, 10.03.2005 09:27
Kontaktdaten:

Beitrag von lomtas »

Vielen Dank für alle Hilfe. Ich habe es jetzt anders umgesetzt, aber es funktioniert. :D Ohne dich hätte ich es nicht geschafft! Danke.
Antworten